Sql 如何为每个外键选择数量有限的行?

Sql 如何为每个外键选择数量有限的行?,sql,mysql,Sql,Mysql,我有这张桌子: id feed_id ... 假设我有500行,我想为每个feed_id选择3个条目?总限额为50 如何编写此SQL?您是否尝试过使用子选择和限制 差不多 SELECT * FROM Table t WHERE ID IN (SELECT ID FROM @Table WHERE FEED_ID = t.FEED_ID LIMIT 3) LIMIT 500 使用: 不清楚的是您希望返回的内容的详细信息—表中的所有行,或者只是feedid。在transact-SQL

我有这张桌子:

id
feed_id
...
假设我有500行,我想为每个feed_id选择3个条目?总限额为50


如何编写此SQL?

您是否尝试过使用子选择和限制

差不多

SELECT  *
FROM    Table t
WHERE   ID IN (SELECT ID FROM @Table WHERE FEED_ID = t.FEED_ID LIMIT 3)
LIMIT 500
使用:


不清楚的是您希望返回的内容的详细信息—表中的所有行,或者只是feedid。

在transact-SQL中,您将使用TOP语句,不确定这是否适用于此处…

您可以借助存储过程来执行此操作

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;

我认为这不适用于@Table中的subselect SELECT ID,其中FEED\u ID=t。FEED\u ID LIMIT 3将只返回第一个FEED\u ID的三个ID。您必须考虑到这是在WHERE子句中的子选择中完成的,因此它将是每个feedid的第一个3。这不起作用。不幸的是,MySQL不支持子查询中的限制。这对我不适用。我试过从feed\u条目中选择*t,其中id在feed\u条目中选择id,其中feed\u id=t.feed\u id LIMIT 3 LIMIT 50,结果是:1235-这个版本的MySQL还不支持“LIMIT&IN/ALL/ANY/SOME subquery”Bummer:我想这是一个非常巧妙的解决方法。这对我来说很有效,但不显示feed_id=1的行。我做错什么了吗?@Keyne:查询中没有排除feedid的内容-你确定有id值的记录吗?接下来我要看的是,如果您忘记了ORDER BY,这对查询绝对重要。例如,我删除了所有feed_id=1的行,当我再次运行查询时,feed_id 2不会显示,这是行集中的第一行。我已经解决了这一问题,更改了这一行:JOIN SELECT@rownum:=NULL,@feed:=0 r当@feed:=0正常工作时。无论如何谢谢你@凯恩:奇怪-我猜数据类型真的很重要。哈,从来没有经历过-很高兴听到你明白了。
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;