Mysql Нужна небольшая помощь в составлении MySQL запроса

ikiborg

Новичок
Доброго времени суток PHP товарищи. Нужна небольшая помощь. Моя проблема в следующем: нужно сделать выборку из таблицы одним запросом ( без лишнего php кода), но не простую. Конкретнее:имеется таблица следующего вида
PHP:
id | type | timestamp
, строки группируются по type ( необходимо вывести все строки с одинаковым type, а не одну как это делает GROUP BY `type`), а затем все сгруппированные строки сортируются по timestamp. Например. Таблица с данными:
PHP:
id | type | timestamp
---+------+-----------
6  | 3    | 48 
5  | 1    | 45 
4  | 2    | 40 
3  | 1    | 32 
2  | 2    | 30 
1  | 1    | 28
После сортировки, должно получится так:
PHP:
id | type | timestamp
---+------+-----------
6  | 3    | 48 
5  | 1    | 45 
3  | 1    | 32 
1  | 1    | 28
4  | 2    | 40 
2  | 2    | 30
Надеюсь вам понятен ход моих мыслей.
P.S. Поле type может иметь сотни, а позже тысячи значений
 

ikiborg

Новичок
Этот запрос почти то, что нужно
PHP:
SELECT * FROM `table` GROUP BY `type` ORDER BY `timestamp`
Но из-за GROUP BY строки с одинаковым type "съедаются" и не выводятся в результате. А надо бы.
 

ikiborg

Новичок
так пробовал?
Код:
SELECT * FROM `table` ORDER BY `type`,`timestamp`
пробывал... но сортировка идёт не так как надо. сортируется сначала по полу type, а уже потом по полю timestamp. То-есть получится так:
PHP:
id | type | timestamp
---+------+-----------
5  | 1    | 45
3  | 1    | 32
1  | 1    | 28
4  | 2    | 40 
2  | 2    | 30
6  | 3    | 48
А надо так:
PHP:
id | type | timestamp
---+------+-----------
6  | 3    | 48
5  | 1    | 45
3  | 1    | 32
1  | 1    | 28
4  | 2    | 40
2  | 2    | 30
 

Gas

может по одной?
У меня такое наворотилось http://www.sqlfiddle.com/#!2/f7c2a/22
Но наверное можно проще сделать.

Можно чтоб такой сложный запрос не городить, одним запросом получить type в нужном порядке,
а вторым запросом вытянуть данные, сделав ORDER BY FIND_IN_SET(type, '_список_type_из_первого_запроса_'), timestamp DESC
 
Последнее редактирование:

С.

Продвинутый новичок
После сортировки, должно получится так:
PHP:
id | type | timestamp
---+------+-----------
6 | 3 | 48
5 | 1 | 45
3 | 1 | 32
1 | 1 | 28
4 | 2 | 40
2 | 2 | 30
Надеюсь вам понятен ход моих мыслей.
Уже не понятен. Что это за пронцип сортировки?
 

Gas

может по одной?
Я так понял что для каждого type определить максимальный timestamp, это будет порядок сортировки type'ов, а потом уже в рамках каждого отсоритровать по timestamp
 

Gas

может по одной?
Добавь where во вложенный запрос с group by type, или просто общее where по таблице t2
 
Последнее редактирование:

Gas

может по одной?
ikiborg
Добавил вариант без переменных в запросе, а с подставновкой types в find_in_set
http://www.sqlfiddle.com/#!2/f7c2a/37

Только нужно помнить что максимальная длина group_concat 1024 символа по умолчания, чтоб твой список types влез в это ограничение
 

ikiborg

Новичок
чуть-чуть подправив запрос и удалив некоторые лишние присвоения, получил следующее
PHP:
SELECT * FROM `test` ORDER BY FIND_IN_SET(`type`, (SELECT GROUP_CONCAT(`type`) FROM (SELECT `type` FROM `test` GROUP BY `type` ORDER BY max(`timestamp`) DESC) AS `t`)), `timestamp` DESC
 
Сверху