Как выбрать ограниченное количество строк для каждого внешнего ключа? - PullRequest
4 голосов
/ 07 апреля 2010

У меня есть эта таблица:

id
feed_id
...

Допустим, у меня есть 500 строк, и я хочу выбрать 3 записи для каждого feed_id? И 50 как общий лимит.

Как написать этот SQL?

Ответы [ 4 ]

3 голосов
/ 07 апреля 2010

Использование:

SELECT x.feedid
  FROM (SELECT t.feedid,
               CASE WHEN @feed != t.feedid THEN @rownum := 1 ELSE @rownum := @rownum + 1 END AS rank,
               @feed := t.feedid
          FROM TABLE t
          JOIN (SELECT @rownum := NULL, @feed := 0) r
      ORDER BY t.feedid) x
 WHERE x.rank <= 3
 ORDER BY x.feedid
 LIMIT 50

Что не ясно, так это детали того, что вы хотите вернуть - все строки в вашей таблице или только feedid.

3 голосов
/ 07 апреля 2010

Вы пытались использовать подвыбор и ограничение?

Что-то вроде

SELECT  *
FROM    Table t
WHERE   ID IN (SELECT ID FROM @Table WHERE FEED_ID = t.FEED_ID LIMIT 3)
LIMIT 500
0 голосов
/ 07 апреля 2010

Вы можете сделать это с помощью хранимой процедуры.

DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_feed`()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE a INT;
DECLARE cur1 CURSOR FOR SELECT id FROM test.id LIMIT 50;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur1;
REPEAT
FETCH cur1 INTO a;
    IF NOT done THEN
        SELECT * FROM feed_id WHERE id=a LIMIT 3;               
    END IF;
UNTIL done END REPEAT;
CLOSE cur1;

END$$
DELIMITER;
0 голосов
/ 07 апреля 2010

В транзакционном SQL вы бы использовали оператор TOP, не уверенный, применимо ли это здесь ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...