У меня есть приложение чата, и я использую PHP для получения данных из MYSQL. Я не знаю, как это назвать лучшим способом, поэтому я собираюсь проиллюстрировать это как можно лучше. Ниже приведен пример настройки базы данных.

БАЗА ДАННЫХ

ID       MESSAGE       DATETIME 
------------------------------------------
1        Hello1.        2019-04-23 23:04:31
1        Hello2.        2019-03-23 10:04:31
1        Hello3.        2019-04-26 22:04:31
1        Hello4.        2019-04-23 13:01:10
2        Hello5.        2019-04-09 23:04:31
2        Hello6.        2019-04-23 23:04:31
2        Hello7.        2019-04-12 23:04:12
2        Hello8.        2019-04-11 20:04:31
3        Hello9.        2019-05-18 19:04:29
3        Hello10.       2019-02-22 23:04:31
3        Hello11.       2019-03-25 23:04:30
4        Hello12.       2019-04-23 15:04:31
4        Hello13.       2019-04-10 23:04:31
5        Hello14.       2019-01-14 23:04:31

ДОЛЖЕН ВЫБРАТЬ

ID       MESSAGE       DATETIME 
------------------------------------------
1        Hello3.        2019-04-26 22:04:31
2        Hello6.        2019-04-23 23:04:31
3        Hello9.        2019-05-18 19:04:29
4        Hello12.       2019-04-23 15:04:31
5        Hello14.       2019-01-14 23:04:31

То, что я пытаюсь сделать, это выбрать самый новый идентификатор один раз для каждого другого идентификатора. Так что для ID 1 я бы выбрал только тот, у которого DATETIME новейший, и так далее, и так далее.

mysql_query("SELECT * FROM messages WHERE ____?____ ORDER BY __?__");

Так что в этом случае должно быть только 5 результатов. Один из каждого идентификатора с новейшей датой. Любая помощь будет принята с благодарностью. Спасибо.

5
Brett Taylor 2 Май 2019 в 08:14

3 ответа

Лучший ответ

Вам нужно значение MAX(date), но по одному на каждый идентификатор. Поскольку вам также нужно сообщение, которое не появляется в предложении GROUP BY, вы должны запустить соединение таблицы для себя.

В объединенной таблице вы получите максимальную дату и идентификатор, сгруппированные по идентификатору - это даст вам максимальную дату для каждого идентификатора. Объедините это в своей таблице по идентификатору и дате, что позволит вам получить другие столбцы, которые не существуют в GROUP BY (так как этот GROUP BY находится в объединенной таблице, он вам не нужен в основной стол).

SELECT m.id, m.message, m.date
FROM messages m
JOIN (
  SELECT id, MAX(date) AS date
  FROM foo
  GROUP BY id
) AS t
ON m.id=t.id AND m.date=t.date
4
Qirel 2 Май 2019 в 05:38

Вы можете попробовать отсортировать их в подзапросе перед группировкой по идентификатору следующим образом:

SELECT * FROM (SELECT * FROM messages ORDER BY DATETIME DESC) AS sortedMessages GROUP BY ID;

Или

mysql_query("SELECT * FROM (SELECT * FROM messages ORDER BY DATETIME DESC) AS sortedMessages GROUP BY ID;");
0
Chuksy 2 Май 2019 в 05:54

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

0
Steven Martin 7 Май 2019 в 14:12