Problem jest taki, że mam 2 złączenia typy LEFT, ale tylko jedno z nich działa jak potrzeba. Gdy pierwsze działa dobrze, to wyniki dla każdego rekordu z pierwszego złączenia przenoszą się do wyników z drugiego złączenia i na odwrót w zależności od sposobu użycia GROUP BY. Męczę się z tym już 2 dzień i nic nie mogę zrobić.
Posiadam też zapytanie które złącza w sumie 6 tabel (te dwie i 4 inne + ADDONS), ale odkryłem, że konflikt zachodzi tylko pomiędzy złączeniami tabel
RATES i
INSTALLATIONS. Z innymi nie ma najmniejszych problemów.
Tabela
RATES:
id | user_id | addon_id | rate
Tabela
INSTALLATIONS:
id | user_id | addon_id
Zapytanie, które prawie działa (wyniki z 2 JOINa do 1 JOINa):
SELECT a.*,
COUNT(r.id) AS rates,
COUNT(i.id) AS ins
FROM `addons` AS a
LEFT JOIN rates AS r ON r.addon_id = a.id
LEFT JOIN installations AS i ON i.addon_id = a.id
GROUP BY a.id, r.id
Po zamianie
r.id na
i.id w GROUP BY wyniki z 1 JOINa są przenoszone do każdego rekordu dopasowanego z 2 JOINa tzn, że jak dopasowań z 1 JOINa było 4, a za 2 JOINa 5 to wartości z 1 JOINa są przenoszone do 5 rekordów z 2 JOINa.
Zapytanie, które prawie działa z 6 złączeniami
SELECT a.*,
u.login, admins.priv AS `author_priv`,
COUNT(i.id) AS `installations`,
COUNT(r.id) AS `rates`,
SUM(r.rate) AS `good`,
COUNT(r.id)-SUM(r.rate) AS `bad`,
COUNT(c.id) AS `comments_count`,
s.id AS `installed`
FROM `addons` AS `a`
LEFT JOIN `users` AS `u` ON u.id = a.author_id
LEFT JOIN `admins` ON u.id = admins.user_id
LEFT JOIN `addonsets` AS `s` ON s.addon_id = a.id AND s.user_id = 1
LEFT JOIN `addon_comments` AS `c` ON c.addon_id = a.id
LEFT JOIN `rates` AS `r` ON r.addon_id = a.id
LEFT JOIN `installations` AS `i` ON i.addon_id = a.id
GROUP BY a.id, c.addon_id, i.addon_id, r.id
ORDER BY SUM(r.rate) / COUNT( r.id ) DESC
W uproszczeniu problem wygląda tak: ZŁĄCZYĆ TABELE RATES I INSTALLATIONS Z TABELĄ ADDONSDoszedłem do czegoś takiego, ale działa podobnie:
SELECT a.id, rates_c, ins_c
FROM `addons` AS a
LEFT JOIN (SELECT r.id, r.addon_id, COUNT(*) AS rates_c FROM rates AS r GROUP BY r.id) AS r ON r.addon_id = a.id
LEFT JOIN (SELECT i.id, i.addon_id, COUNT(*) AS ins_c FROM installations AS i GROUP BY i.id) AS i ON i.addon_id = a.id
GROUP BY a.id, r.id
Troszkę zagmatwane, ale mam nadzieje, że ktoś mniej więcej wie co mam na myśli i mi pomoże. Z góry dziękuje za pomoc.
MAM!Pokaż wiersze 0 - 8 ( 9 wszystkich, Wykonanie zapytania trwało 0.0063 sekund(y))SELECT a.*,
u.login,
admins.priv AS `author_priv`,
ins_c AS `installations`,
r.rates_c AS `rates`,
r.sum_rates AS `good`,
r.rates_c-r.sum_rates AS `bad`,
COUNT(c.id) AS `comments_count`,
s.id AS `installed`
FROM `addons` AS `a`
LEFT JOIN `users` AS `u` ON u.id = a.author_id
LEFT JOIN `admins` ON u.id = admins.user_id
LEFT JOIN `installations` AS `s` ON s.addon_id = a.id AND s.user_id = 1
LEFT JOIN `addon_comments` AS `c` ON c.addon_id = a.id
LEFT JOIN (
SELECT r.id, r.addon_id, SUM(r.rate) AS sum_rates, COUNT(*) AS rates_c
FROM rates AS r
GROUP BY r.addon_id
) AS r ON r.addon_id = a.id
LEFT JOIN (
SELECT i.id, i.addon_id, COUNT(*) AS ins_c
FROM installations AS i
GROUP BY i.addon_id
) AS i ON i.addon_id = a.id
GROUP BY a.id
ORDER BY sum_rates / rates_c DESC
Mała optymalizacja i będzie cacy
DO ZAMKNIĘCIA / USUNIĘCIA
Ten post edytował zamper 7.11.2012, 18:24:31