MySQL отображает строки, где значение равно NULL или равно X - PullRequest
12 голосов
/ 08 января 2012

userPosts.value может содержать одно из двух значений: 0 или 1.

Я оставлен присоединиться к userPosts в моей таблице сообщений.

Я хочу получить все сообщения из моей таблицы сообщений, где 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

Так что я делаю не так?

Ответы [ 3 ]

21 голосов
/ 08 января 2012

Попробуйте использовать круглые скобки при 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
1 голос
/ 08 января 2012

Вы частично ответили на свой вопрос в заголовке: ИЛИ не AND, но попробуйте использовать 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
1 голос
/ 08 января 2012

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

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

...