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:
  1. id | user_id | addon_id | rate

Tabela INSTALLATIONS:
  1. id | user_id | addon_id


Zapytanie, które prawie działa (wyniki z 2 JOINa do 1 JOINa):
  1. SELECT a.*,
  2. COUNT(r.id) AS rates,
  3. COUNT(i.id) AS ins
  4. FROM `addons` AS a
  5. LEFT JOIN rates AS r ON r.addon_id = a.id
  6. LEFT JOIN installations AS i ON i.addon_id = a.id
  7. 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
  1. SELECT a.*,
  2. u.login, admins.priv AS `author_priv`,
  3. COUNT(i.id) AS `installations`,
  4. COUNT(r.id) AS `rates`,
  5. SUM(r.rate) AS `good`,
  6. COUNT(r.id)-SUM(r.rate) AS `bad`,
  7. COUNT(c.id) AS `comments_count`,
  8. s.id AS `installed`
  9. FROM `addons` AS `a`
  10. LEFT JOIN `users` AS `u` ON u.id = a.author_id
  11. LEFT JOIN `admins` ON u.id = admins.user_id
  12. LEFT JOIN `addonsets` AS `s` ON s.addon_id = a.id AND s.user_id = 1
  13. LEFT JOIN `addon_comments` AS `c` ON c.addon_id = a.id
  14. LEFT JOIN `rates` AS `r` ON r.addon_id = a.id
  15. LEFT JOIN `installations` AS `i` ON i.addon_id = a.id
  16. GROUP BY a.id, c.addon_id, i.addon_id, r.id
  17. ORDER BY SUM(r.rate) / COUNT( r.id ) DESC



W uproszczeniu problem wygląda tak: ZŁĄCZYĆ TABELE RATES I INSTALLATIONS Z TABELĄ ADDONS

Doszedłem do czegoś takiego, ale działa podobnie:
  1. SELECT a.id, rates_c, ins_c
  2. FROM `addons` AS a
  3. 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
  4. 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
  5. 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))
  1. SELECT a.*,
  2. u.login,
  3. admins.priv AS `author_priv`,
  4. ins_c AS `installations`,
  5. r.rates_c AS `rates`,
  6. r.sum_rates AS `good`,
  7. r.rates_c-r.sum_rates AS `bad`,
  8. COUNT(c.id) AS `comments_count`,
  9. s.id AS `installed`
  10.  
  11. FROM `addons` AS `a`
  12.  
  13. LEFT JOIN `users` AS `u` ON u.id = a.author_id
  14. LEFT JOIN `admins` ON u.id = admins.user_id
  15. LEFT JOIN `installations` AS `s` ON s.addon_id = a.id AND s.user_id = 1
  16. LEFT JOIN `addon_comments` AS `c` ON c.addon_id = a.id
  17. LEFT JOIN (
  18. SELECT r.id, r.addon_id, SUM(r.rate) AS sum_rates, COUNT(*) AS rates_c
  19. FROM rates AS r
  20. GROUP BY r.addon_id
  21. ) AS r ON r.addon_id = a.id
  22. LEFT JOIN (
  23. SELECT i.id, i.addon_id, COUNT(*) AS ins_c
  24. FROM installations AS i
  25. GROUP BY i.addon_id
  26. ) AS i ON i.addon_id = a.id
  27.  
  28. GROUP BY a.id
  29. ORDER BY sum_rates / rates_c DESC

Mała optymalizacja i będzie cacy biggrin.gif

DO ZAMKNIĘCIA / USUNIĘCIA