Подсчитать количество непросмотренных постов - PullRequest
0 голосов
/ 06 мая 2011

У меня есть структура БД, как:

сообщения

id
title
content

Пользователи

id
....

post_reads

post_id
user_id

Как подсчитать количество сообщений, для которых конкретный пользователь с идентификатором говорит: x не имеет прочитанной записи.

Мой SQL-запрос в настоящее время выглядит так:

SELECT COUNT(posts.id) AS c
FROM `posts`
LEFT JOIN `post_reads` ON (`posts`.`id` = `post_reads`.`post_id`)
LEFT JOIN `users` ON (post_reads.user_id = `users`.`id` AND post_reads.user_id = x)
WHERE users.id IS NULL
AND post_reads.user_id IS NULL

Я знаю, что делаю что-то не так, хотя я не уверен, что это такое.

Ответы [ 2 ]

2 голосов
/ 06 мая 2011

Это должно к подвоху

SELECT COUNT(posts.id) AS c
FROM posts
LEFT JOIN post_reads ON posts.id = post_reads.post_id AND post_reads.user_id = x
LEFT JOIN users ON post_reads.user_id = users.id
WHERE users.id IS NULL

Обратите внимание, что если вы не заинтересованы в том, чтобы что-то делать с пользователями таблиц, вы можете сократить этот запрос до:

SELECT COUNT(posts.id) AS c
FROM posts
LEFT JOIN post_reads ON posts.id = post_reads.post_id AND post_reads.user_id = x
WHERE post_reads.user_id IS NULL

Первое объединение, которое вы делали, на самом деле является внутренним объединением, потому что оно никогда не «пропускает огонь».

При втором соединении иногда произойдет сбой, потому что у вас есть условие extra .
Поэтому использование post_reads.some_id is null никогда не будет правдой.
Для того, чтобы это работало, вам нужно будет повторить AND post_reads.user_id = x и в этом условии соединения, но вставлять его дважды глупо и не нужно, один раз это сделает.

PS не забудьте заменить 'x' на что-то более полезное: -)

1 голос
/ 06 мая 2011

Я пробовал это несколькими способами, просто используя JOINS / WHERE, но они, как правило, пропускают определенные случаи (т. Е. Вы можете исключить сообщения, присоединенные к записи чтения для данного пользователя, но идентификаторы сообщений будут по-прежнему возвращаться, если они присоединиться, чтобы читать записи для других пользователей).

Самый простой способ может быть примерно таким:

SELECT COUNT(DISTINCT id) 
FROM posts
WHERE id NOT IN (SELECT DISTINCT post_id FROM post_reads WHERE user_id = @x)

Кроме того, обратите внимание, что я не верю, что вам нужно заключать идентификаторы в символы обратной галочки, если они не являются ключевыми словами MySQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...