2012-01-08 15 views
7

userPosts.value может содержать одно из двух значений: 0 или 1.MySQL отображения строк, где значение равно NULL или равно X

Я Left Присоединение userPosts к моему столу сообщений.

Я хочу получить все сообщения из моей таблицы Posts, где userPosts.value = 0, а также все сообщения, у которых вообще нет userPosts.value (таким образом, NULL).

Следующая получить только мне сообщения, где значение = 0, но не NULL:

SELECT * FROM $wpdb->posts 
LEFT JOIN userPosts ON ($wpdb->posts.ID = userPosts.postID) 
WHERE userPosts.value != 1 
ORDER BY $wpdb->posts.post_date DESC 

Следующая получает только мне сообщения, где значение = NULL:

SELECT * FROM $wpdb->posts 
LEFT JOIN userPosts ON ($wpdb->posts.ID = userPosts.postID) 
WHERE userPosts.value IS NULL 
ORDER BY $wpdb->posts.post_date DESC 

, но это не дает никаких результатов :

SELECT * FROM $wpdb->posts 
LEFT JOIN userPosts ON ($wpdb->posts.ID = userPosts.postID) 
WHERE userPosts.value = 0 
AND userPosts.value IS NULL 
ORDER BY $wpdb->posts.post_date DESC 

, и это делает мои сообщения со значением = 0, а также NULL, но он повторяет все мои NULL сообщений три раза!

SELECT * FROM $wpdb->posts 
LEFT JOIN userPosts ON ($wpdb->posts.ID = userPosts.postID) 
WHERE userPosts.value = 0 
OR userPosts.value IS NULL 
ORDER BY $wpdb->posts.post_date DESC 

Так что я делаю неправильно?

ответ

15

Попробуйте использовать parenthasis на OR состоянии (userContests.value = 0 OR userContests.value IS NULL)

SELECT * FROM $wpdb->posts 
    LEFT JOIN userPosts ON ($wpdb->posts.ID = userPosts.postID) 
    WHERE (userContests.value = 0 
    OR userContests.value IS NULL) 
    ORDER BY $wpdb->posts.post_date DESC 
+0

Это сделал трюк, спасибо вы! – Sweepster

1

(x = 0) AND (x is NULL) - одно поле не может быть двух значений одновременно. Нет ничего удивительного в том, что вы не получите никаких результатов, потому что вы указали условие, которое невозможно удовлетворить.

Что касается остальной части запроса. Вы используете $wdpd->posts в качестве исходной таблицы, но затем используйте таблицу с именем userContests в предложении where. Разрешает ли $ wpdb-> сообщение пользователям userContests? Если да, зачем делать динамическое имя таблицы в одном месте и жестко закодировать ее в другом?

1

Вы частично ответили на свой вопрос в заголовке: или нет, и, но попробуйте использовать DISTINCT:

SELECT DISTINCT * FROM $wpdb->posts -- Note "DISTINCT" 
LEFT JOIN userPosts ON ($wpdb->posts.ID = userPosts.postID) 
WHERE userContests.value = 0 
OR userContests.value IS NULL -- Note "OR" 
ORDER BY $wpdb->posts.post_date DESC 
Смежные вопросы