Переписать этот SQL-запрос - PullRequest
3 голосов
/ 25 января 2010

Я написал SQL-запрос, который получает непрочитанные сообщения, но я думаю, что могу улучшить код (скорость и удобочитаемость). Первый выбор предназначен для функции COUNT, второй - для группировки сообщений в соответствии с разговорным_иде, а последний вложенный выбор - для выбора последних сообщений.

Пожалуйста, дайте мне предложения. Заранее спасибо.

SELECT COUNT(*) as unreaded FROM ( 
  SELECT id 
  FROM (
    SELECT id, conversation_id
    FROM messages
    WHERE to_id = ?
    AND readed = 0
    and NOT hide_from = ?
    ORDER BY sended DESC
  ) AS temp_messages 
  GROUP BY conversation_id
) as temp_messages2

Ответы [ 3 ]

2 голосов
/ 25 января 2010

Запрос как есть, не будет работать - вам нужно определить все столбцы, которые не обернуты в агрегаты в GROUP BY.

Непонятно, но если вы хотите количество уникальных разговоров, используйте:

SELECT COUNT(DISTINCT m.conversation_id) AS unread
  FROM MESSAGES m
 WHERE m.to_id = ?
   AND m.readed = 0
   AND m.hide_from != ?

... в противном случае используйте:

SELECT COUNT(*) AS unread
  FROM MESSAGES m
 WHERE m.to_id = ?
   AND m.readed = 0
   AND m.hide_from != ?
  • Подзапросы не нужны
  • ORDER BY - пустая трата ресурсов, потому что он не используется в конечном результате и не используется TOP
  • GROUP BY не будет работать, потому что MESSAGES.id отсутствует в списке столбцов
0 голосов
/ 25 января 2010
SELECT COUNT(*) as unreaded FROM ( 
  SELECT id, conversation_id
  FROM messages
  WHERE to_id = ?
  AND readed = 0
  and NOT hide_from = ?
  GROUP BY conversation_id
) as temp_messages2

Вам не нужно предложение order by, и вы можете переместить предложение group by во внутренний подзапрос.

0 голосов
/ 25 января 2010

Это вообще работает? Идентификатор не в агрегате, поэтому вы не можете выбрать группу идентификаторов по разговору.

При этом вы ищете разговоры с непрочитанными сообщениями?

select count(distinct conversation_id) from message
 WHERE to_id = ? 
   AND readed = 0 
   and NOT hide_from = ? 

должен получить то, что вам нужно

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