Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL Nieprawidłowe zapytanie:zbyt wysoki poziom zagnieżdżenia do zaznaczenia

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ć.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL:Jak przeszukiwać wiele tabel w poszukiwaniu ciągu istniejącego w dowolnej kolumnie?

  2. Jak przekonwertować Lat Long na adres w php z json api?

  3. Czy bardziej wydajne jest rozdzielanie dużych i małych powiązanych danych w kolumnie tabeli SQL?

  4. Warunek IF w skrypcie mysql

  5. Laravel Prosty wybór miesiąca