2010-04-07 27 views

回答

3

用途:

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。

+0

這對我很有用,但是feed_id = 1的行沒有出現,我做錯了什麼? – 2010-04-08 21:02:49

+0

@Keyne:查詢中沒有任何內容排除feedid - 您確定有id值的記錄嗎?接下來我要看的是如果您忘記了ORDER BY - 這對於查詢來說是非常重要的 – 2010-04-08 21:36:01

+0

Actualy feed_id 1沒有問題,問題在於第一行,例如,我刪除了feed_id = 1的所有行,並且當我再次運行查詢時,feed_id 2不顯示,這是行集合中的第一個。 – 2010-04-09 00:36:43

2

您是否嘗試過使用子選擇和限制?

喜歡的東西

SELECT * 
FROM Table t 
WHERE ID IN (SELECT ID FROM @Table WHERE FEED_ID = t.FEED_ID LIMIT 3) 
LIMIT 500 
+0

我不認爲這會子選擇工作(SELECT ID FROM @Table WHERE FEED_ID = t.FEED_ID LIMIT 3) 將返回1 FEED_ID – Salil 2010-04-07 05:32:25

+0

的只有三個ID。你必須考慮到這是在where子句中的子選擇中完成的,因此它將是第1個3 ** PER ** feedid – 2010-04-07 05:42:01

+0

這不起作用。不幸的是,MySQL在子查詢中不支持LIMITS。 – 2010-04-07 15:51:52

0

在Transact SQL如果應用在這裏你可以使用TOP語句,不知道...

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; 
相關問題