MYSQL - Как объединить два запроса, чтобы пропустить элементы, найденные во втором запросе (или, возможно, какое-нибудь лучшее решение?) - PullRequest
1 голос
/ 16 августа 2011

У меня есть база данных wordpress с несколькими настраиваемыми полями / метаданными.

---------
wp_postmeta
---------
post_id
meta_key
meta_value

Я хочу найти все сообщения с мета-ключом «Дата начала» и значением «NOW ()», но не посты с мета-ключом «Текущий» и значением «Да».

Я немного запутался в том, как объединить запросы:

SELECT * FROM wp_posts, wp_postmeta
WHERE wp_posts.ID = wp_postmeta.post_id
AND wp_postmeta.meta_key = 'Start Date'
AND wp_postmeta.meta_value > NOW()

с

SELECT * FROM wp_posts, wp_postmeta
WHERE wp_posts.ID = wp_postmeta.post_id
AND wp_postmeta.meta_key = 'Ongoing'
AND wp_postmeta.meta_value != 'Yes'

И, возможно, другие запросы ... Я думаю, что меня отталкивает, так это то, что я не могу добавить еще одно предложение WHERE в утверждение?Я думаю, мне просто нужно подтолкнуть в правильном направлении, потому что мне не хватает некоторого базового понимания MySQL.

Заранее большое спасибо!

Ответы [ 3 ]

1 голос
/ 16 августа 2011

Попробуйте это:

SELECT * FROM wp_posts, wp_postmeta
WHERE wp_posts.ID = wp_postmeta.post_id
AND ((wp_postmeta.meta_key = 'Start Date'
AND wp_postmeta.meta_value > NOW()) OR (wp_postmeta.meta_key = 'Ongoing'
AND wp_postmeta.meta_value != 'Yes'))
0 голосов
/ 16 августа 2011

Попробуйте использовать

SELECT * FROM wp_posts, wp_postmeta
WHERE wp_posts.ID = wp_postmeta.post_id
AND wp_postmeta.meta_key = 'Start Date'
AND wp_postmeta.meta_value > NOW() and wp_posts.ID NOT IN (select post_id from wp_postmeta
where wp_postmeta.meta_key = 'Ongoing' AND wp_postmeta.meta_value = 'Yes')
0 голосов
/ 16 августа 2011

Я помню, что был там.Вы не хотите знать неумелое, запутанное решение, которое я придумал.

Вы просто ищете пару парен и AND с NOT.

SELECT * FROM wp_posts, wp_postmeta
WHERE wp_posts.ID = wp_postmeta.post_id
 -- parens make sure everything is grouped correctly and you don't have "and
 -- meta_key - Ongoing and meta_value > NOW()
(wp_postmeta.meta_key = 'Start Date'
 AND wp_postmeta.meta_value > NOW())
-- these conditions are all mutually exclusive, so they could never 
-- simultaneously exist.
AND NOT
(wp_postmeta.meta_key = 'Ongoing'
 AND wp_postmeta.meta_value != 'Yes')

Если вы хотите объединить результаты , у вас есть возможность использовать OR.Просто замените AND NOT на OR и посмотрите, что произойдет.

Вы также можете использовать UNION (хотя это почти никогда не делается, когда OR является опцией (кажется, я помню, чтоТам могут быть небольшие различия в производительности, но беспокоиться об этом часто преждевременной оптимизации)):

SELECT * FROM wp_posts, wp_postmeta
WHERE wp_posts.ID = wp_postmeta.post_id
wp_postmeta.meta_key = 'Start Date'
AND wp_postmeta.meta_value > NOW()
-- Distinct vs. ALL is not really relevant here because you can't have overlap
UNION DISTINCT
SELECT * FROM wp_posts, wp_postmeta
WHERE wp_posts.ID = wp_postmeta.post_id
wp_postmeta.meta_key = 'Ongoing'
AND wp_postmeta.meta_value != 'Yes'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...