MySQL запрос с несколькими AND - PullRequest
0 голосов
/ 26 ноября 2011

Я новичок в MySQL, и у меня возникла проблема с запросом, использующим PHP. Смотрите три последние строки.

$query = "
SELECT post_content, slug, ID
FROM wp_posts

INNER JOIN wp_term_relationships
ON wp_posts.ID = wp_term_relationships.object_id

INNER JOIN wp_terms
ON wp_term_relationships.term_taxonomy_id = wp_terms.term_id

INNER JOIN wp_postmeta
ON wp_posts.ID = wp_postmeta.post_id

WHERE post_status = 'publish' AND slug = 'a-slug' AND meta_key <> 'include' AND meta_key <> 'exkludera'
OR post_status = 'publish' AND slug = 'a-slug' AND meta_key = 'include' AND meta_value = '72'
OR post_status = 'publish' AND slug = 'a-slug' AND meta_key = 'exclude' AND meta_value <> '72'
";

С тремя последними строками я хочу сказать:

Строка 1) Выберите запрос, если он: Публикуется, имеет a-slug и не имеет meta_key "include" или "exclude"

Строка 2) Выберите запрос, если он: Публикуется, имеет a-slug, имеет meta_key «include», а meta_value равно «72»

Строка 3) Выберите запрос, если он: Публикуется, имеет a-slug, имеет meta_key «exclude» и значение meta_value не равно «72»

Но это возвращает мне двойную или тройную цену каждого выбора. Его следует выбирать только в том случае, если он соответствует одному из этих трех сенарио. Что я делаю не так?

Ответы [ 3 ]

4 голосов
/ 26 ноября 2011

Вам необходимо использовать скобки:

WHERE (post_status = 'publish' AND slug = 'a-slug' AND meta_key <> 'include' AND meta_key <> 'exkludera')
OR (post_status = 'publish' AND slug = 'a-slug' AND meta_key = 'include' AND meta_value = '72')
OR (post_status = 'publish' AND slug = 'a-slug' AND meta_key = 'exclude' AND meta_value <> '72')

Просто смешивая OR и AND операторов, как вы делаете в вашем примере, получается true для всех случаев, где post_status = 'publish'.

Кстати, я предполагаю, что Row 1) и т. Д. Относится к строкам в вашем коде, а не к строкам, которые вы хотите вернуть из базы данных ...

1 голос
/ 26 ноября 2011

Это должно помочь поставить круглые скобки вокруг отдельных наборов критериев.

, например

$query = "
...
WHERE 
(post_status = 'publish' AND slug = 'a-slug' AND meta_key <> 'include' AND meta_key <> 'exkludera')
OR 
(post_status = 'publish' AND slug = 'a-slug' AND meta_key = 'include' AND meta_value = '72')
OR 
(post_status = 'publish' AND slug = 'a-slug' AND meta_key = 'exclude' AND meta_value <> '72')
";

На самом деле, поскольку некоторые критерии являются общими, вы можете переписать его так:

$query = "
...
WHERE 
post_status = 'publish' AND slug = 'a-slug' AND
(
 (meta_key <> 'include' AND meta_key <> 'exkludera')
 OR 
 (meta_key = 'include' AND meta_value = '72')
 OR 
 (meta_key = 'exclude' AND meta_value <> '72')
)
";

Вы также можете использовать DISTINCT, чтобы при необходимости возвращалась только одна копия каждой записи.

SELECT DISTINCT post_content, slug, ID
0 голосов
/ 26 ноября 2011

У меня была такая же проблема.

Я полагаю, что проблема в том, что вы не заключаете свое ИЛИ, когда объединяете их с AND, которые вы используете. При использовании ИЛИ и И вместе они должны быть заключены в скобки "()", иначе у вас возникнет конфликт.

Вот ссылка, показывающая пример и хорошо написанные описания того, как это работает: http://www.w3schools.com/sql/sql_and_or.asp

...