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. icitari - 09 Августа, 2017 - 21:34:55 - перейти к сообщению
Здравствуйте. Нужна помощь.
Есть таблица: smf_messages
id_topic ......... poster_time
.... 1 ............. 1501966868
.... 1 ............. 1501966869
.... 2 ............. 1501966870
.... 3 ............. 1501966871
.... 2 ............. 1501966872
.... 1 ............. 1501966873
.... 4 ............. 1501966874


Нужно создать запрос mysql, что бы происходила сортировка поля poster_time (время) по убыванию а поле id_topic что бы не повторялось, то есть выбрать уникальные значения.

То есть должно получиться следующее:

id_topic ....................... poster_time
..... 4 .......................... 1501966874
..... 1 .......................... 1501966873
..... 2 .......................... 1501966872
..... 3 .......................... 1501966871
2. Vladimir Kheifets - 10 Августа, 2017 - 07:47:22 - перейти к сообщению
icitari пишет:
Здравствуйте. Нужна помощь.
Есть таблица: smf_messages
id_topic ......... poster_time
.... 1 ............. 1501966868
.... 1 ............. 1501966869
.... 2 ............. 1501966870
.... 3 ............. 1501966871
.... 2 ............. 1501966872
.... 1 ............. 1501966873
.... 4 ............. 1501966874


Нужно создать запрос mysql, что бы происходила сортировка поля poster_time (время) по убыванию а поле id_topic что бы не повторялось, то есть выбрать уникальные значения.

То есть должно получиться следующее:

id_topic ....................... poster_time
..... 4 .......................... 1501966874
..... 1 .......................... 1501966873
..... 2 .......................... 1501966872
..... 3 .......................... 1501966871


Доброе утро! Попробуйте так:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT id_topic, poster_time FROM smf_messages GROUP BY id_topic ORDER BY id_topic DESC
3. icitari - 10 Августа, 2017 - 08:42:37 - перейти к сообщению
Доброе утро. Не получается, в данном случае сначала выбираются уникальные значения id_topic, а потом происходит сортировка по poster_time, то есть выведет что то вроде этого:

id_topic ......... poster_time
.... 4 ............. 1501966874
.... 3 ............. 1501966871
.... 2 ............. 1501966870
.... 1 ............. 1501966868

А необходимо, что бы сначала произошла сортировка по убыванию poster_time, а потом в таком же порядке (по убыванию poster_time) отобрались уникальные значения id_topic
4. Ch_chov - 10 Августа, 2017 - 09:35:06 - перейти к сообщению
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT *
  2. FROM (SELECT * FROM smf_messages ORDER BY poster_time DESC) sub
  3. GROUP BY id_topic
  4. ORDER BY poster_time DESC


или

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT id_topic, MAX(poster_time) poster_time
  2. FROM smf_messages
  3. GROUP BY id_topic
  4. ORDER BY poster_time DESC
5. icitari - 10 Августа, 2017 - 09:46:25 - перейти к сообщению
Да, спасибо, подходит)))
(Добавление)
Цитата:
SELECT *
FROM (SELECT * FROM smf_messages ORDER BY poster_time DESC) sub
GROUP BY id_topic
ORDER BY poster_time DESC

Пожалуйста, подскажите, что здесь означает слово sub
6. Мелкий - 10 Августа, 2017 - 11:05:13 - перейти к сообщению
Это алиас для таблицы подзапроса. И процитирован неправильный метод, используйте второй с использованием аггрегатной max.
Первый не будет работать ни во внятных СУБД ни в самом MySQL версии начиная с 5.7 без специальных правок sql_mode. И возможно вообще не будет в следующих релизах. Давно не читал relnotes к 8, что там уже выкидывают, а что пока только deprecated.

 

Powered by ExBB FM 1.0 RC1