Mysql
 sql >> база данни >  >> RDS >> Mysql

mysql заявка един към много с отрицание и/или множество критерии

Ще напиша присъединяването за изключване без подзаявки:

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;

Уверете се, че имате индекс за продуктите в двете колони (активен, productid) в този ред.

Трябва също да имате индекс на продуктовите тагове върху двете колони (productid, tag) в този ред.

Друга заявка, която ще трябва да направя, е нещо като всички (Кола) или (Скейтборд) или (Зелен И Мотоциклет) или (Червен И Мотоциклет).

Понякога тези сложни условия са трудни за MySQL оптимизатора. Едно често срещано решение е да използвате UNION за комбиниране на по-прости заявки:

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:Вашата таблица за маркиране не е таблица за стойност на обект-атрибут.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Получаване на данни от множество таблици в един ред, докато се конкатенират някои стойности

  2. присъединете се към два външни ключа от една и съща таблица в SQL

  3. Търсене на думи със скраб с заместващи знаци

  4. MYSQL:Обединете две таблици в една, с обединение

  5. Отпадането на таблицата кара MySQL да виси