Родились сегодня:
Ильдар Рифович Альмиев


Лидеры рейтинга

ID: 405049

vsetin

Студент

2944


ID: 401284

Михаил Александров

Советник

904

Россия, Санкт-Петербург


ID: 226425

Konstantin Shvetski

Модератор

664

Россия, Северодвинск


ID: 259041

Алексеев Владимир Николаевич

Мастер-Эксперт

363

Россия, пос. Теплоозёрск, ЕАО


ID: 400669

epimkin

Профессионал

349


ID: 325460

CradleA

Мастер-Эксперт

297

Беларусь, Минск


ID: 137394

Megaloman

Мастер-Эксперт

236

Беларусь, Гомель


8.9.0

20.06.2021

JS: 2.9.2
CSS: 4.5.10
jQuery: 3.6.0
DataForLocalStorage: 2021-06-21 08:46:16-standard


Создание программ на языках PHP, Perl и Python.

Администратор раздела: Коцюрбенко Алексей Владимирович (Старший модератор)

Консультация онлайн # 74061

Раздел: PHP / Perl / Python
Автор вопроса: Defalex
Дата: 04.02.2007, 15:27 Консультация закрыта
Поступило ответов: 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?

Ответ # 141863 от lupus campestris
Здравствуйте, 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)
Получаем то, что нужно. Правда, добавляется лишнее поле...
Удачи!

lupus campestris

Посетитель
07.02.2007, 11:54
Мини-форум консультации # 74061

Нет сообщений в мини-форуме

Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.

Лучшие эксперты раздела

Коцюрбенко Алексей Владимирович

Старший модератор

Рейтинг: 173

Хватов Сергей

Академик

Рейтинг: 0

Асмик Гаряка

Советник

Рейтинг: 0

SAW

Студент

Рейтинг: 0

Марк Крейн

5-й класс

Рейтинг: 0

Evgen aka Chuma

6-й класс

Рейтинг: 0