2016-09-03 8 views
0

У меня есть запрос, который возвращает животное пост, если meta_key существует и не «»:MySQL: возвращают сообщения, если meta_key не существует

-- Pets that are assigned tags 
SELECT p.ID 
FROM FxFfekP0_posts p LEFT JOIN FxFfekP0_postmeta pm 
ON p.ID = pm.post_id 
WHERE p.post_type = 'pets' 
AND pm.meta_key = 'tag' 
AND pm.meta_value != '' 

Но теперь мне нужно, чтобы получить набор результатов, содержащие сообщения что либо не содержит meta_key tag, либо meta_key tag = '' ...

Помощь?

ответ

1

Что-то, как это должно работать:

SELECT p.ID 
FROM FxFfekP0_posts p LEFT JOIN FxFfekP0_postmeta pm 
ON p.ID = pm.post_id AND pm.meta_key = 'tag' 
WHERE p.post_type = 'pets' 
AND ifnull(pm.meta_value, '') = '' 

Я переехал pm.meta_key = 'tag' в условие соединения, поэтому отсутствуют строки по-прежнему появляются в наборе результатов (как NULL с); тогда ifnull() позволяет выбрать одно условие: NULL s и пустые строки.

+0

Если я объяснил переместив условие в объединение плохо, просто сравнить 'SELECT p.ID FROM FxFfekP0_posts p LEFT JOIN FxFfekP0_postmeta pm ON p.ID = pm.post_id WHERE p.post_type = 'pets' AND pm.meta_key = 'tag'' с' SELECT p.ID FROM FxFfekP0_posts p LEFT JOIN FxFfekP0_postmeta pm ON p.ID = pm.post_id AND pm.meta_key = 'tag' WHERE p.post_type = 'post''. Последнее должно возвращать намного больше строк, что важно, включая те сообщения без записей тегов в таблице postmeta. – Hobo

+0

Мне в основном нужно отделить эти два. Мне нужно знать, у каких домашних животных есть тег (где тег существует и не является пустым или NULL) ... и затем знайте, у каких домашних животных нет тега (вообще нет значения) или запись тега пустая. – dcolumbus

+0

Я немного потерял. У вас есть первый запрос (вы отправили его в вопрос); этот запрос возвращает второй результирующий набор (именно это вы специально задали) - сообщения, чьи теги отсутствуют или пусты. Если это не сработало для вас, потому что у меня был неправильный тип сообщения от моего тестирования (теперь исправлено)? – Hobo

0

Я считаю, что это будет работать на то, что я ищу ... если кто-то не может указать, где этот запрос не:

SELECT p.ID 
FROM FxFfekP0_posts p 
LEFT JOIN FxFfekP0_postmeta pm ON pm.post_id = p.ID 
AND pm.meta_key = 'tag' 
WHERE p.post_type = 'pets' 
AND pm.meta_key IS NULL 
OR pm.meta_value = '' 
+0

Я был бы немного осторожен с приоритетом 'AND' и' OR'. Хотя это может быть маловероятно в вашем конкретном случае, если у вас есть тип разницы с мета-ключом «tag», вы можете получить неожиданные результаты. MySQL будет интерпретировать ваше предложение 'where' как' WHERE (p.post_type = 'pets' AND pm.meta_key IS NULL) ИЛИ (pm.meta_value = '') '. Я бы поставил круглые скобки вокруг 'pm.meta_key IS NULL OR pm.meta_value = '''. Кроме этого, разве это не логично так же, как мой ответ? – Hobo

+0

http://stackoverflow.com/questions/12345569/mysql-or-and-precedence для получения более подробной информации – Hobo