Как написать запрос без использования подзапроса? - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть этот запрос, и он отлично работает, но я хотел улучшить его и написать без подзапроса.Это возможно?Хотя я много пробовал, я не могу получить правильные результаты.

SELECT * FROM store_product
    WHERE product_id NOT IN (
                SELECT entity_id
                FROM import_pack_file_element
                    WHERE entity_id IS NOT NULL
                       AND import_pack_file_id IN (135)
                       AND status = 'DONE') AND store_id = 65

Ответы [ 5 ]

0 голосов
/ 13 декабря 2018

Вы можете попробовать это (но лучше использовать подзапрос):

SELECT [table alias].*
FROM store_product [table alias]
LEFT JOIN import_pack_file_element [table alias] on [table alias].[key] = [table alias].[key]
WHERE [table alias].entity_id IS NOT NULL AND [table alias].import_pack_file_id IN(135) AND [table alias].status = 'DONE'

Вы можете изменить LEFT JOIN part и WHERE part в соответствии со своими потребностями.

также: [ключ] к ключу таблицы, [псевдоним таблицы] к псевдониму таблицы.

, а также это, вы можете заменить IN (135) и использовать знак равенства =, IN используется для более чем одного элемента, который нужно сравнить или проверить.

и здесь ссылка:

LEFT JOIN

0 голосов
/ 13 декабря 2018

У меня нет полных знаний о дизайне вашего стола, но это может сработать:

SELECT * FROM store_product x LEFT OUTER JOIN import_pack_file_element y
                              ON x.product_id = y.entity_id
 WHERE x.product_id IS NULL
   AND import_pack_file_id = 135 
   AND status = 'DONE'
0 голосов
/ 13 декабря 2018

Вы можете использовать условие LEFT JOIN и IS NULL

SELECT store_product.* 
FROM store_product 
LEFT JOIN import_pack_file_element ON store_product.product_id = import_pack_file_element.entity_id 
    AND import_pack_file_element.import_pack_file_id IN (135)
    AND import_pack_file_element.status = 'DONE'
WHERE  
   import_pack_file_element.entity_id IS NULL 
0 голосов
/ 13 декабря 2018

Вы можете переписать запрос NOT EXISTS или NOT IN для анти-объединения.Однако я не вижу причин, почему вы хотели бы это сделать.Анти-объединения обычно используются в СУБД, которые имеют проблемы с прямым [NOT] IN / [NOT] EXISTS, что не должно быть в случае с MySQL.Анти-объединения являются средством защиты от слабости СУБД и имеют цену потери читабельности.

SELECT sp.*
FROM store_product sp
LEFT JOIN import_pack_file_element ipfe
  ON ipfe.entity_id = sp.product_id
  AND ipfe.import_pack_file_id = 135
  AND ipfe.status = 'DONE'
WHERE ipfe.entity_id IS NULL;
0 голосов
/ 13 декабря 2018

Вы можете использовать предложение EXISTS:

SELECT *
FROM store_product sp
WHERE NOT EXISTS (SELECT 1 FROM import_pack_file_element i
                  WHERE i.entity_id = sp.product_id AND 
                        import_pack_file_id = 135 AND status = 'DONE');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...