LINUX.ORG.RU

Ответ на: комментарий от SOmni

Вот пример: Сократить до 2-х записей по каждой группе столбца А.

Таблица:
+-----------------------+
| id |    A    |   B    |
+-----------------------+
| 1  | group 1 | text 1 |
+-----------------------+
| 2  | group 1 | text 2 |
+-----------------------+
| 3  | group 1 | text 3 |
+-----------------------+
| 4  | group 1 | text 4 |
+-----------------------+
| 5  | group 1 | text 5 |
+-----------------------+
| 6  | group 2 | text 6 |
+-----------------------+
| 7  | group 2 | text 7 |
+-----------------------+
| 8  | group 2 | text 8 |
+-----------------------+
| 9  | group 3 | text 9 |
+-----------------------+

После выполнения запроса записи с id = 3, 4, 5, 8 должны удалиться

anterior
() автор топика
Ответ на: комментарий от anterior

Не уверен, насчет мускуля (нет под рукой, чтобы поэкспериментировать), но в оракле можно делать так:

select id, a, b from my_table t1
where t1.id in (select id from my_table t2 where t1.a = t2.a and rownum<=2)
order by t1.id

rownum<=2 потому, что в оракле нет limit, так что попробуй просто заменить на limit 2
Так же не уверен, как там насчет вложенных запросов.
В любом случае, может натолкнет на какие-то мысли...

P.S. думаю, запрос будет крайне неэффективным :)

SOmni ★★
()
Ответ на: комментарий от SOmni

Спасибо за идею, но вот мне какая ошибка выдалась:
ERROR 1235 (42000): Эта версия MySQL пока еще не поддерживает 'LIMIT & IN/ALL/ANY/SOME subquery'

А с rownum понятное дело не канает :(

PS:
$ mysql --version
mysql Ver 14.14 Distrib 5.1.30, for debian-linux-gnu (x86_64) using EditLine wrapper

anterior
() автор топика
Ответ на: комментарий от anterior

сначала делаешь подзапрос, который выводит номер элемента в каждой группе (столбец 3)
+--------------------+
| id |    A    |  N  |
+--------------------+
| 1  | group 1 |  1  |
+--------------------+
| 2  | group 1 |  2  |
+--------------------+
| 3  | group 1 |  3  |
+--------------------+
| 4  | group 1 |  4  |
+--------------------+
| 5  | group 1 |  5  |
+--------------------+
| 6  | group 2 |  1  |
+--------------------+
| 7  | group 2 |  2  |
+--------------------+
| 8  | group 2 |  3  |
+--------------------+
| 9  | group 3 |  4  |
+--------------------+
Потом из этого выбираешь все элементы где N<3

aydar ★★★★★
()
Ответ на: комментарий от aydar

Хорошая идея :) Осталось только сообразить как сделать запрос который выводит номер элемента в каждой группе... что-то на ум ничего не приходит...

anterior
() автор топика
Ответ на: комментарий от anterior

Вот как раз это легко

SET @rowId=0;
Set @oldA=-1;
SELECT @rowId:=IF(@oldA!=A,1,@rowId+1) as row, @oldA:=A as A,B FROM table
ORDER BY A,B

crimaniak
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.