#1 15.04.09 12:54
[mysql] MIN и LIMIT в "одном" запросе
Тестовая `posts` таблица:
Код: mysql:
CREATE TABLE `posts` ( `id` INT(10) NOT NULL AUTO_INCREMENT, `topic_id` INT(10) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=1 ;
Вида
id topic_id
1 1
2 1
3 1
4 1
5 2
6 1
7 2
8 2
9 2
10 2
Необходимо выбрать допустим 3 последних записи с определёным topic_id (например 1) и найти минимальный id из этих трёх.
Я тут попытался сначала
Код: mysql:
SELECT MIN(id) FROM posts WHERE topic_id=1 ORDER BY id DESC LIMIT 3
но мускул всё делает в порядке как написано в запросе, то есть сначала выбирает все записи у которых topic_id=1, сортирует по айди и только потом отбрасывает всё кроме 3х записей, поэтому MIN(id) = 1, а нада 3.
Потом вспомнил про подзапросы
Код: mysql:
SELECT MIN(id) FROM posts WHERE id IN (SELECT id FROM posts WHERE topic_id=1 ORDER BY id DESC LIMIT 3)
И получил ошибку от мускула
This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
Но таки получилось уйти от этой ошибки
Код: mysql:
SELECT MIN(id) FROM posts WHERE id IN (SELECT id FROM (SELECT id FROM posts WHERE topic_id=1 ORDER BY id DESC LIMIT 3) Alias)
MIN(id) = 3
Но это же ахтунг какойто. Нет ли способа поэлегантней что ли?
Исправлено iDrum (15.04.09 12:54)
Offline
#2 15.04.09 14:14
Re: [mysql] MIN и LIMIT в "одном" запросе
ты лишний селект делаешь
Код: sql:
SELECT MIN(id) FROM (SELECT id FROM posts WHERE topic_id=1 ORDER BY id DESC LIMIT 3) t1
P.S.
а элегантнее - это как понимать? короче? так-то для таких вещей делают вьюхи и работают с вьюхами, как с таблицами
Исправлено Jaguar (15.04.09 14:19)
Offline

