Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Выборка записей по одной штуке


Автор: Igor_K 23.9.2011, 12:59
Здравствуйте. 
Никак не могу додуматься как такое сделать. Есть таблица user_history , в ней поля user_id, time. time - дата в unix timestamp. Мне нужно получить самые новые записи для каждого пользователя. То есть по одной записи каждого пользователя с наивысшим значением поля time. Не подскажите как составить запрос? Спасибо

Автор: z-END 23.9.2011, 13:04
а простой вариант с GROUP BY  user_id и ORDER BY time DESC  не поможет?

Автор: Igor_K 23.9.2011, 13:22
z-END, нет, это я уже пробовал. Таким методом только самая первая запись (верхняя) в наборе правильная, а остальные - нет.

Автор: AndreyIQ 23.9.2011, 13:27
Код

SELECT user_id, max(time) FROM user_history GROUP BY user_id

Автор: Igor_K 23.9.2011, 13:50
AndreyIQ, к сожалению тоже не то. Мне нужно получить всю запись с наивысшим значением time, а не конкретно само значение. В таблице есть другие поля, которые меня и интересуют.

Такой запрос работает, но я хочу попроще что-то без подзапросов таких :(
Код

SELECT a.user_id, a.time, a.data FROM user_history AS a WHERE a.time = (SELECT time FROM user_history 
WHERE user_id = a.user_id ORDER BY time DESC LIMIT 0, 1);

Автор: AndreyIQ 23.9.2011, 13:58
Цитата(Igor_K @ 23.9.2011,  13:50)
Такой запрос работает, но я хочу попроще что-то без подзапросов таких :(

ИМХО только с подзапросом

Автор: z-END 23.9.2011, 14:02
кстати а DISTINCT(user_id) тут тоже не поможет?

Автор: AndreyIQ 23.9.2011, 14:12
Цитата(z-END @ 23.9.2011,  14:02)
кстати а DISTINCT(user_id) тут тоже не поможет?

Нет, DISTINCT обрабатывает все поля выборки.

Автор: Igor_K 23.9.2011, 14:18
Цитата(z-END @  23.9.2011,  14:02 Найти цитируемый пост)
кстати а DISTINCT(user_id) тут тоже не поможет? 

А к какому запросу его применить? Я просто не пойму. 

Цитата(AndreyIQ @  23.9.2011,  13:58 Найти цитируемый пост)
ИМХО только с подзапросом 

это плохо..

Автор: Akina 23.9.2011, 14:24
http://www.sql.ru/forum/actualthread.aspx?tid=687908

Автор: Igor_K 23.9.2011, 15:50
Akina, спасибо. То, что надо!  smile 

Еще вопрос про индекс. Если я использую запрос такой:
Код

select user_id,time,data from (
     select max(100000000*p1.time + p1.id) mod 100000000 pid 
       from user_history p1
      group by user_id ) zz
  join user_history p on zz.pid=p.id

то мне нужно составить такой индекс?
Код

ALTER TABLE user_history ADD INDEX ( `user_id` , `time` , `id` ) 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)