Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: вывод сообщений
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » вывод сообщений

Страниц (1): [1]
 

1. Богдан Скуба - 14 Июня, 2017 - 23:37:53 - перейти к сообщению
Всем привет, у меня есть таблица : messages
id | sender | taker | message | date | value
нужно вывести последние сообщения всех диалогов отсортированых по date
все перепробовал ничего придумать или найти не могу
2. OrmaJever - 15 Июня, 2017 - 00:51:38 - перейти к сообщению
мускуль?
3. Vladimir Kheifets - 15 Июня, 2017 - 08:34:01 - перейти к сообщению
Богдан Скуба пишет:
Всем привет, у меня есть таблица : messages
id | sender | taker | message | date | value
нужно вывести последние сообщения всех диалогов отсортированых по date
все перепробовал ничего придумать или найти не могу


Привет! Попробуйте так. Проверил. У меня работает.

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT message FROM messages WHERE date = ( SELECT MAX(date) FROM messages)
4. Sail - 15 Июня, 2017 - 14:00:21 - перейти к сообщению
Vladimir Kheifets, и получите все сообщения за последнюю дату.
Добавьте связку соотнесенного подзапроса с отправителем или получателем сообщения, чтобы идентифицировать диалог. Учтя при этом, что отправитель или получатель в одном диалоге могут участвовать в других диалогах, с другими получателями или отправителями...
При этом допускаем, что (судя по структуре таблички) между парой отправитель-получатель может вестись только один диалог...
5. OrmaJever - 15 Июня, 2017 - 20:46:17 - перейти к сообщению
раз ответа я не услышал то вот запрос для постгреса, а дальше сами переделывайте
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT *
  2. FROM messages
  3. WHERE id IN (
  4.    SELECT max(id)
  5.    FROM messages
  6.    GROUP BY CASE WHEN sender > taker THEN taker || '-' || sender ELSE  sender || '-' || taker END;
  7.    ORDER BY date DESC
  8.    LIMIT 10
  9. )
  10. ORDER BY date
6. Мелкий - 15 Июня, 2017 - 22:56:01 - перейти к сообщению
OrmaJever, запрос именно в постгресе работать не будет в принципе даже после правки синтаксической ошибки. Пошлёт нафиг за попытку сортировки по неаггрегатному полю.
А вот mysql при должном старании по части sql_mode как раз прожуёт. Правда, со случайным результатом.

Ну и seqscan гарантированный, да.

Постгресу можно как-то так index scan сделать по индексу sender, taker, date:
CODE (SQL):
скопировать код в буфер обмена
  1. WITH RECURSIVE t AS (
  2. (SELECT sender, taker, id FROM messages ORDER BY sender DESC, taker DESC, date DESC LIMIT 1)
  3. UNION ALL
  4. SELECT bpt.* FROM t, LATERAL (
  5. SELECT sender, taker, id FROM messages m WHERE (m.sender, m.taker)<(t.sender, t.taker)
  6. ORDER BY sender DESC, taker DESC, date DESC
  7. LIMIT 1
  8. ) AS bpt
  9. )
  10. SELECT * FROM messages WHERE id IN (SELECT max(t.id) FROM t GROUP BY least(t.sender), greatest(t.taker))

Что-то более нормальное как-то уже лениво придумывать там, где вообще-то нужна отдельная табличка со ссылкой на последнее сообщение.
7. OrmaJever - 16 Июня, 2017 - 16:18:48 - перейти к сообщению
Мелкий пишет:
Пошлёт нафиг за попытку сортировки по неаггрегатному полю.

согласен, не заметил, надо


Мелкий пишет:
Ну и seqscan гарантированный, да.

это да, но это из-за условия, в идеале нужно отдельное поле для обозначения диалога
8. Vladimir Kheifets - 18 Июня, 2017 - 08:52:50 - перейти к сообщению
Sail пишет:
Vladimir Kheifets, и получите все сообщения за последнюю дату.
Добавьте связку соотнесенного подзапроса с отправителем или получателем сообщения, чтобы идентифицировать диалог. Учтя при этом, что отправитель или получатель в одном диалоге могут участвовать в других диалогах, с другими получателями или отправителями...
При этом допускаем, что (судя по структуре таблички) между парой отправитель-получатель может вестись только один диалог...


Из название поля "date" не следует, что тип поля также "date".
В данном случае, тип поля должен быть "datetime".
Исходя из этого я показал как найти последнее сообщение.
Конечно, Вы правы, что допускать можно всё, что угодно и если необходимо ставить дополнительные условия. MySQL справится.
9. Sail - 18 Июня, 2017 - 11:20:28 - перейти к сообщению
Vladimir Kheifets пишет:
Из название поля "date" не следует, что тип поля также "date".
В данном случае, тип поля должен быть "datetime".
Исходя из этого я показал как найти последнее сообщение.

Суть не в детализации времени (в день, в час, в секунду...), а в том, что требуется не одно последнее сообщение всех диалогов, а последнее сообщение для каждого диалога.
10. Vladimir Kheifets - 22 Июня, 2017 - 15:11:14 - перейти к сообщению
Sail пишет:
Vladimir Kheifets пишет:
Из название поля "date" не следует, что тип поля также "date".
В данном случае, тип поля должен быть "datetime".
Исходя из этого я показал как найти последнее сообщение.

Суть не в детализации времени (в день, в час, в секунду...), а в том, что требуется не одно последнее сообщение всех диалогов, а последнее сообщение для каждого диалога.

Добрый день!
Прочтите, пожалуйста, вопрос, с корого началась тема:
Богдан Скуба пишет:
Всем привет, у меня есть таблица : messages
id | sender | taker | message | date | value
нужно вывести последние сообщения всех диалогов отсортированых по date
все перепробовал ничего придумать или найти не могу

Я понял так, что требуется "вывести последние сообщения всех диалогов", а не "последнее сообщение для каждого диалога".

 

Powered by ExBB FM 1.0 RC1