У меня есть приложение чата, и я использую 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 результатов. Один из каждого идентификатора с новейшей датой. Любая помощь будет принята с благодарностью. Спасибо.
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
- Скрипка SQL показывает живой результат http://sqlfiddle.com/#!9/c70c3/7а>
Вы можете попробовать отсортировать их в подзапросе перед группировкой по идентификатору следующим образом:
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;");
Или вы можете создать вторую таблицу с беседами, в которой может быть тема и последнее сообщение в строке, а затем вы просто вернете эту полную таблицу, при открытии беседы вы извлечете отдельные сообщения из таблицы сообщений на основе conversationID
Похожие вопросы
Новые вопросы
php
PHP - это широко используемый высокоуровневый, динамический, объектно-ориентированный и интерпретируемый язык сценариев, в первую очередь предназначенный для серверной веб-разработки. Используется для вопросов о языке PHP.