Консультация № 74061
04.02.2007, 15:27
0.00 руб.
0 1 1
Есть таблица в MySQL table:

id |id_1 |id_2 |id_3 |id_4
---------------------------------------
1 |2 |1 |txt |563654
2 |2 |2 |txt |684596
3 |2 |5 |txt |563655
4 |2 |6 |txt |684536
5 |2 |3 |txt |566654
6 |2 |4 |txt |604596

Мне нужно выбрать из таблицы 5 последних записей, но так, чтобы id_2 были все разные (id - auto_increment, id_4 - уникальное datetime).
Я посылаю такой запрос:
$query = "SELECT * FROM table GROUP BY id_2 ORDER by id DESC LIMIT 5";
Выбирает все правильно: строки 6,5,4,3,2, но когда добавляю новые записи:

7 |2 |7 |txt |566654
8 |2 |1 |txt |604596

то будут выбраны строки 7,6,5,4,3.

Я так полагаю, что группировка по id_2 группирует 8-ю запись с 1-й, и они не попадают с выбираемую 5-ку, т.к. id у 1-й строчки старее (меньше).

Так вот, как выбрать записи так, чтобы id_2 по-прежнему группировались, но выводилась бы запись из каждой группы с последним id, а не с первым?

То есть чтобы в последнем случае вывелись строки 8,7,6,5,4?

Обсуждение

Неизвестный
07.02.2007, 11:54
общий
это ответ
Здравствуйте, Defalex!
На примере:
1) mysql> select * from last;
+------+------+------+------+--------+
| id | id_1 | id_2 | id_3 | id_4 |
+------+------+------+------+--------+
| 1 | 2 | 1 | txt | 563654 |
| 2 | 2 | 2 | txt | 684596 |
| 3 | 2 | 5 | txt | 563655 |
| 4 | 2 | 6 | txt | 684536 |
| 5 | 2 | 3 | txt | 566654 |
| 6 | 2 | 4 | txt | 604596 |
| 7 | 2 | 7 | txt | 566654 |
| 8 | 2 | 1 | txt | 604596 |
| 9 | 2 | 4 | txt | 546372 |
+------+------+------+------+--------+
9 rows in set (0.00 sec)
Это аналог Вашей таблицы.
2) Делаем запрос:
mysql> select * from last inner join (select distinct id_2 as a from last order by id desc limit 5) as something on last.id_2=something.a where id=(select max(id) from last where last.id_2=something.a) order by id desc;
+------+------+------+------+--------+------+
| id | id_1 | id_2 | id_3 | id_4 | a |
+------+------+------+------+--------+------+
| 9 | 2 | 4 | txt | 546372 | 4 |
| 7 | 2 | 7 | txt | 566654 | 7 |
| 5 | 2 | 3 | txt | 566654 | 3 |
| 4 | 2 | 6 | txt | 684536 | 6 |
| 3 | 2 | 5 | txt | 563655 | 5 |
+------+------+------+------+--------+------+
5 rows in set (0.00 sec)
Получаем то, что нужно. Правда, добавляется лишнее поле...
Удачи!
Форма ответа