SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 16.09.2008 13:32:03

megamansqlinfo
Участник
Зарегистрирован: 16.09.2008
Сообщений: 3

Несовместимы LIMIT и IN

Есть 2 табл. группы_публик и публикации. задача показать из каждой группы по 5 публкаций у которых время создания наибольшее.
Немогу придумать как была задумка что подзапрос выдаст время а потом используя IN получим результат. Но  LIMIT и IN нельзя использовать вместе . ПОдскажите почему? и что можно придумать с запросом?

Неактивен

 

#2 16.09.2008 13:42:34

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

Re: Несовместимы LIMIT и IN

IN и LIMIT нельзя использовать вместе - такая особенность реализации. Планируется исправить в MySQL 6.0
Можете использовать временную таблицу:

DROP TEMPORARY TABLE IF EXISTS in_tbl;
CREATE TEMPORARY TABLE in_tbl ENGINE=MEMORY SELECT ... (то что в подзапросе)
SELECT * FROM in_tbl JOIN tbl USING(date) ...
 

Неактивен

 

#3 16.09.2008 15:34:44

megamansqlinfo
Участник
Зарегистрирован: 16.09.2008
Сообщений: 3

Re: Несовместимы LIMIT и IN

Спасибо. Но я как то немогу разобратся с JOIN и как это работает.
Немогу придумать алгритм по которому действовать.  Уточню вопрос. выбрать из каждой группы по определенному количеству.  например по 5 штук и что бы эти 5 выбирались по мах времени. Если бы существовало что то типа LIMIT в  LIMITe
(В таблице из которой нужно выбрать есть соответственно поле group_id - группа к которой относится запись).

Неактивен

 

#4 16.09.2008 16:46:55

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

Re: Несовместимы LIMIT и IN

Можно путем сложного присвоения переменных внутри запроса:

SET @group_id:=0, @ord1:=0, @ord2=0;
SELECT * FROM
            (SELECT *, IF(@group_id=group_id, @ord1:=@ord1+1, @ord1:=1) AS ord1, @ord2:=@ord2+1 AS ord2, @group_id := group_id
             FROM table ORDER BY group_id, my_date DESC) AS sub
WHERE ord1<=5 ORDER BY ord2;


ord1 - номер строки в группе, ord2 - общий номер, чтобы сохранить сортировку сначала по группе, а внутри группы по дате

Неактивен

 

#5 16.09.2008 16:55:21

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

Re: Несовместимы LIMIT и IN

Поправил немного запро выше. Вот реальный пример для таблицы слоганов на http://sentence.ru

SET @group_id:=0, @ord1:=0, @ord2=0; SELECT * FROM (SELECT topic1,d, IF(@group_id=topic1,@ord1:=@ord1+1, @ord1:=1) ord1, @ord2:=@ord2+1 AS ord2, @group_id := topic1 FROM slogans ORDER BY topic1,d DESC) AS sub WHERE ord1<=2 ORDER BY ord2;



+--------+---------------------+------+------+---------------------+
| topic1 | d                   | ord1 | ord2 | @group_id := topic1 |
+--------+---------------------+------+------+---------------------+
|      0 | 2008-02-29 13:24:51 |    1 |    1 |                   0 |
|      1 | 2008-09-09 15:31:07 |    1 |    2 |                   1 |
|      1 | 2008-09-09 15:25:06 |    2 |    3 |                   1 |
|      2 | 2008-05-11 16:14:06 |    1 |    8 |                   2 |
|      2 | 2008-04-12 13:34:34 |    2 |    9 |                   2 |
|      3 | 2008-08-23 17:34:01 |    1 |   18 |                   3 |
|      3 | 2008-08-05 15:15:21 |    2 |   19 |                   3 |
|      4 | 2007-06-11 21:01:53 |    1 |   34 |                   4 |
|      4 | 2005-08-01 20:29:30 |    2 |   35 |                   4 |
|      5 | 2008-07-27 19:11:04 |    1 |   36 |                   5 |
|      5 | 2007-08-11 09:21:12 |    2 |   37 |                   5 |
|      6 | 2008-08-30 17:07:01 |    1 |   39 |                   6 |
|      6 | 2008-08-14 11:48:25 |    2 |   40 |                   6 |
|      7 | 2008-09-03 20:13:28 |    1 |   69 |                   7 |
|      7 | 2008-04-12 13:35:26 |    2 |   70 |                   7 |
|      8 | 2007-11-21 03:21:33 |    1 |   73 |                   8 |
|      9 | 2008-06-21 07:20:51 |    1 |   74 |                   9 |
|      9 | 2007-11-21 03:22:33 |    2 |   75 |                   9 |
|     10 | 2008-09-12 16:23:08 |    1 |   77 |                  10 |
|     10 | 2008-08-14 11:46:25 |    2 |   78 |                  10 |
|     11 | 2008-09-09 13:54:08 |    1 |   88 |                  11 |
|     11 | 2008-08-14 11:42:42 |    2 |   89 |                  11 |
|     12 | 2008-02-04 11:14:32 |    1 |  102 |                  12 |
|     12 | 2007-03-14 10:53:19 |    2 |  103 |                  12 |
|     13 | 2006-02-18 20:39:31 |    1 |  107 |                  13 |
|     13 | 2005-12-30 22:18:23 |    2 |  108 |                  13 |
..................
 

Неактивен

 

#6 16.09.2008 17:43:09

megamansqlinfo
Участник
Зарегистрирован: 16.09.2008
Сообщений: 3

Re: Несовместимы LIMIT и IN

Спасибо огромное, очень помогло. даже не знал что в майке можно такое творить.

Неактивен

 

Board footer

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