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

mysql zapytanie jeden-do-wielu z negacją i/lub wieloma kryteriami

Napisałbym połączenie wykluczające bez podzapytań:

SELECT p.productid
FROM   products p
INNER JOIN producttags AS t ON p.productid = t.productid
LEFT OUTER JOIN producttags AS x ON p.productid = x.productid 
       AND x.tag IN ('Motorcycle', 'Green')
WHERE  p.active = 1
       AND t.tag IN ( 'Ford', 'Black', 'Skateboard' )
       AND x.productid IS NULL;

Upewnij się, że masz indeks produktów w dwóch kolumnach (aktywna, identyfikator produktu) w tej kolejności.

Powinieneś również mieć indeks tagów produktów w dwóch kolumnach (id produktu, tag) w tej kolejności.

Inne zapytanie, które muszę wykonać, to na przykład wszystko (samochód) lub (deskorolka) lub (zielony AND motocykl) lub (czerwony AND motocykl).

Czasami te złożone warunki są trudne dla optymalizatora MySQL. Jednym z typowych rozwiązań jest użycie UNION do łączenia prostszych zapytań:

SELECT p.productid
FROM   products p
INNER JOIN producttags AS t1 ON p.productid = t1.productid
WHERE  p.active = 1
   AND t1.tag IN ('Car', 'Skateboard')

UNION ALL

SELECT p.productid
FROM   products p
INNER JOIN producttags AS t1 ON p.productid = t1.productid
INNER JOIN producttags AS t2 ON p.productid = t2.productid 
WHERE  p.active = 1
   AND t1.tag IN ('Motorcycle')
   AND t2.tag IN ('Green', 'Red');

PS:Twoja tabela tagowania nie jest tabelą Jednostka-Atrybut-Wartość.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Iteruj przez wiersze Mysql w PHP

  2. Używanie Jquery Ajax do pobierania danych z Mysql

  3. Magazyn binarny MySQL przy użyciu systemu plików BLOB VS OS:duże pliki, duże ilości, duże problemy

  4. Podselekcja lewego łączenia MySQL

  5. zwróć mysql wartość logiczną „tak” lub „nie”