Запрос возвращает дополнительные строки - PullRequest
3 голосов
/ 17 января 2012

У меня есть такая таблица для простого чата:

messages table structure
+----+---------+-----------+---------+------+------+
| id | to_user | from_user | message | read | sent |
+----+---------+-----------+---------+------+------+

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

Username ----  Message ---- Date

Я использую этот запрос длясделайте это:

SELECT *
FROM `messages`
WHERE `sent`
IN (
   SELECT MAX( `sent` )
   FROM `messages`
   WHERE `from_user` = '1' --id of user who is requesting the list
   OR `to_user` = '1'  --id of user who is requesting the list
   GROUP BY `to_user` , `from_user`
   )
LIMIT 0 , 30

И это работает почти нормально, моя проблема в том, что он возвращает мне не последнее сообщение этого разговора, а последнее сообщение от каждого пользователя, так скажем, пользователь 1 и 2 говорит, и я получаю этот список, вот что я получаю:

+----+---------+-----------+-----------------------+------+---------------------+
| id | to_user | from_user | message               | read | sent                |
+----+---------+-----------+-----------------------+------+---------------------+
|  3 |       2 |         1 | Message 1 from user 1 |    0 | 2012-01-11 13:20:54 |
|  4 |       1 |         2 | Message 1 from user 2 |    0 | 2012-01-11 13:24:59 |
+----+---------+-----------+-----------------------+------+---------------------+

И я хотел бы получить только последнее сообщение, которое 4 , потому чтоПоле sent является самым высоким в 4-й записи, так как я могу его решить?

РЕДАКТИРОВАТЬ После удаления group by я получаю только одно сообщение, даже если пользователь говорил с болееодин пользователь

Ответы [ 4 ]

1 голос
/ 18 января 2012

Вот как вы это делаете:

SELECT *
FROM (SELECT * 
  FROM messages
  WHERE from_user = ?
  OR to_user = ?
  ORDER by from_user, to_user, sent DESC
) x
GROUP BY from_user, to_user
ORDER BY sent DESC
LIMIT 1;

В mysql, группа с без агрегирования других столбцов возвращает строку first для каждой группы.Выбрав форму упорядоченного набора строк (внутренний запрос), мы получаем самую последнюю строку для каждого разговора.

1 голос
/ 17 января 2012
SELECT *
FROM `messages`
WHERE `sent`
IN (
   SELECT MAX( `sent` )
   FROM `messages`
   WHERE (`from_user` = '1' OR `to_user` = '1')
   )
LIMIT 0 , 30

группа собирается объединить их, я верю.

1 голос
/ 17 января 2012

Вы получаете последнее сообщение от каждого пользователя, потому что вы сделали GROUP BY для: to_user и from_user.

Нет необходимости использовать предложение GROUP BY в вашем запросе.

0 голосов
/ 17 января 2012

Удалите предложение group by в вашем выражении in - в этом случае оно бесполезно. Он возвращает отметку времени sent для каждой отдельной пары to_user и from_user. Вы действительно хотите, чтобы max sent, где to_user или from_user равнялось некоторому значению. Потеряйте group by, и вы вернете ровно одну запись с последним сообщением пользователю.

Это выглядит так:

SELECT *
FROM `messages`
WHERE `sent`
IN (
   SELECT MAX( `sent` )
   FROM `messages`
   WHERE `from_user` = '1' --id of user who is requesting the list
   OR `to_user` = '1'  --id of user who is requesting the list
   )
LIMIT 0 , 30
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...