SQL-запрос на объединение с использованием строк, для сортировки которых указана только сегодняшняя дата - PullRequest
1 голос
/ 18 августа 2011

Я уверен, что это действительно просто ... просто устал.

У меня есть запрос

SELECT post.*, votes.datetime, COUNT(votes.post_id) AS votes        
FROM posts LEFT JOIN votes          
ON posts.id = votes.post_id         
GROUP BY posts.id       
ORDER BY votes DESC

Мне нужно получить все сообщений налевая таблица при подсчете голосов в таблице голосов с использованием голосов, которые произошли сегодня или между 1 часом и другим часом того же дня.Это имеет достаточный смысл?

Я попытался добавить

WHERE DATE(votes.datetime) = DATE(NOW())

Но не повезло, он просто показывает строки, у которых есть голоса, которые произошли сегодня, и нет строк других сообщений, которые не имеют ни одного голоса.вообще или голосов, которые произошли сегодня.

Я использую тип данных datetime для столбца даты и времени

Есть идеи, как мне это легко сделать?

Заранее спасибо!

-Stefan

Ответы [ 3 ]

2 голосов
/ 18 августа 2011

Используйте подзапрос в выражении голосования LEFT JOIN, указав в нем условие WHERE, которое вы ищете.Затем, при необходимости, оптимизируйте производительность, преобразовав подзапрос.

1 голос
/ 18 августа 2011

Я не совсем уверен, правильно ли я понимаю вашу проблему, но, как я ее понимаю, я бы предложил использовать LEFT OUTER JOIN вместо LEFT JOIN.

Таким образом, вы получите все сообщения, дажебез голосов.

SELECT post.*, votes.datetime, COUNT(votes.post_id) AS votes        
FROM posts LEFT OUTER JOIN votes          
ON posts.id = votes.post_id         
WHERE DATE(votes.datetime) = DATE(NOW())
GROUP BY posts.id       
ORDER BY votes DESC
1 голос
/ 18 августа 2011
LEFT JOIN (SELECT * FROM votes WHERE DATE(datetime) = DATE(NOW())) votes

Я подозреваю, что это не даст вам того, что вы хотите, так как SELECT ... votes.datetime ... приведет к тому, что каждое сообщение будет перечислено несколько раз, а COUNT(votes.post_id) почти всегда будет равно 1.

К сожалениюЯ не могу понять, что вам нужно от вашего вопроса.(Что означает «... от 1 часа до другого часа того же дня»? Кроме того, вы не можете делать заказы по голосам.) Если вы просто хотите подсчитать количество голосов за все сообщения, вы можете сделать это:

SELECT posts.id,
       (SELECT COUNT(*)
          FROM votes
         WHERE DATE(datetime) = DATE(NOW())
           AND post_id = posts.id
       ) AS num_votes
FROM posts
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...