SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 12.02.2008 05:56:18

Babutta
Участник
Откуда: Балашиха
Зарегистрирован: 21.09.2007
Сообщений: 19

Выборка последних записей для каждого типа

Кто-нибудь может подсказать, как можно в одном запросе реализовать следующее.
В таблице много записей, один из столбцов, назовём его theme, может принимать значения от 1 до, например, 20 и никаких больше, определяет тему для данной записи. Надо выбрать для каждой темы последнюю добавленную запись. Т.е. мы должны получить 20 строк, у которых будут уникальные значения theme и при этом они будут последними добавленными в своей теме.

id | theme | text    | date
1  |    1     | раз     | 2008-01-15
2  |   3      | два    | 2008-01-01
3  |   2      | три     | 2008-01-14
4  |    3     | четыре| 2008-01-10
5  |    1     | пять    | 2008-01-10

Т.е. из такой таблички мы должны получить только 1, 3 и 4-ую строки.

Неактивен

 

#2 12.02.2008 11:48:24

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Выборка последних записей для каждого типа

Официальный способ такой: сначала выбрать нужные id, а потом выбрать по ним данные:
SELECT * FROM tablename WHERE id IN (SELECT MAX(id) FROM tablename GROUP BY theme)
Для такого запроса обязательное требование - чтобы id были автоинкрементальными (в
Вашем примере это нарушено). В реальных базах это условие почти всегда соблюдается.

Правильный с точки зрения логики способ - объединить не по id, а по дате (но тогда есть
ненулевая вероятность, что вы вытащите несколько строк с одной датой для одной темы,
т.к. логически они неотличимы):
SELECT t1.* FROM tablename t1
JOIN (SELECT theme, MAX(date) AS date FROM tablename GROUP BY theme) t2
USING (theme, date)

Неактивен

 

#3 12.02.2008 15:40:30

Babutta
Участник
Откуда: Балашиха
Зарегистрирован: 21.09.2007
Сообщений: 19

Re: Выборка последних записей для каждого типа

Спасибо. Но методом тыка выяснил, что можно воспользоваться таким запросом SELECT MAX( date ), id, theme, text FROM my_table GROUP BY 3

Неактивен

 

#4 12.02.2008 16:30:06

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Выборка последних записей для каждого типа

Посмотрите на Ваш запрос внимательнее. Он выдаст id и text не соответствующие date. Вообще говоря он некорректен, так как вы смешиваете группируемые и негруппируемые переменные.

Неактивен

 

#5 12.02.2008 19:30:20

Babutta
Участник
Откуда: Балашиха
Зарегистрирован: 21.09.2007
Сообщений: 19

Re: Выборка последних записей для каждого типа

Да, так и есть. Спасибо большое smile

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson