Może być powiązany zBłądem MySQL #41156. Lista tabel pochodnych działa jak łańcuch wzajemnie -zagnieżdżone podzapytania .
Dziennik błędów wskazuje, że został zweryfikowany z MySQL 5.0.72, 5.1.30 i 6.0.7.
Naprawiono w MySQL 5.1.37, MySQL 5.4.2 (który stał się 5.5.coś) i NDB 7.1.0 .
Jeśli chodzi o przeprojektowane zapytanie w powyższym pytaniu:
Zapytania przestawne mogą być trudne. Możesz użyć metody zaproponowanej przez Andrew w jego odpowiedzi . Jeśli szukasz wielu wartości UPC, musisz napisać kod aplikacji, aby zbudować zapytanie SQL, dołączając tyle klauzul JOIN, ile szukasz wartości UPC.
MySQL ma limit liczby złączeń, które można wykonać w pojedynczym zapytaniu, ale przykład, który powinieneś osiągnąć, nie osiąga tego limitu. Oznacza to, że wyświetlone zapytanie działa.
Zakładam, że pokazujesz przykładowe zapytanie wyszukujące cztery kody UPC, podczas gdy Twoja aplikacja może konstruować zapytanie dynamicznie dla większej liczby kodów UPC, a czasami może być ich więcej niż 61.
Wygląda na to, że celem Twojego zapytania jest zwrócenie sklepów, które mają co najmniej jeden z wymienionych kodów UPC. Możesz to zrobić prościej za pomocą następującego zapytania:
SELECT DISTINCT s.*
FROM allStores AS s
JOIN storeCheckRecords AS cr
ON s.e_address = cr.e_address
AND cr.upc IN ('650637119004','650637119011','650637374007','650637374014');
Możesz użyć tej metody na inne sposoby, na przykład, aby znaleźć sklepy, które mają wszystkie cztery UPC:
SELECT s.*
FROM allStores AS s
JOIN storeCheckRecords AS cr
ON s.e_address = cr.e_address
AND cr.upc IN ('650637119004','650637119011','650637374007','650637374014');
GROUP BY s.e_address
HAVING COUNT(DISTINCT upc) = 4;
Lub znaleźć sklepy, w których niektóre, ale nie wszystkie cztery UPC:
SELECT s.*
FROM allStores AS s
JOIN storeCheckRecords AS cr
ON s.e_address = cr.e_address
AND cr.upc IN ('650637119004','650637119011','650637374007','650637374014');
GROUP BY s.e_address
HAVING COUNT(DISTINCT upc) < 4;
Lub znaleźć sklepy, w których brakuje wszystkich czterech UPC:
SELECT s.*
FROM allStores AS s
JOIN storeCheckRecords AS cr
ON s.e_address = cr.e_address
AND cr.upc IN ('650637119004','650637119011','650637374007','650637374014');
WHERE cr.e_address IS NULL;
Nadal musisz napisać kod, aby zbudować to zapytanie, ale jest to nieco łatwiejsze i nie przekracza żadnych limitów liczby złączeń lub podzapytań, które możesz uruchomić.