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Ą ADDONS
Doszedł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