2010-06-29 88 views
12

我有一個包含記錄的表,它有一個名爲category的行。我插入的文章太多,我只想從每個類別中選擇兩篇文章。MySql查詢:從表中爲每個類別選擇前3行

我試圖做這樣的事情:

我創建了一個觀點:

CREATE VIEW limitrows AS 
    SELECT * FROM tbl_artikujt ORDER BY articleid DESC LIMIT 2 

然後,我創造了這個查詢:

SELECT * 
FROM tbl_artikujt 
WHERE 
    artikullid IN 
    (
     SELECT artikullid 
     FROM limitrows 
     ORDER BY category DESC 
    ) 
ORDER BY category DESC; 

但這不是工作,是給我只有兩個記錄?

回答

11

僅限制停止的結果數量的語句返回。什麼你要找的是通常被稱爲解析/窗/排名功能 - 這MySQL不支持,但你可以模擬使用變量:

SELECT x.* 
    FROM (SELECT t.*, 
       CASE 
       WHEN @category != t.category THEN @rownum := 1 
       ELSE @rownum := @rownum + 1 
       END AS rank, 
       @category := t.category AS var_category 
      FROM TBL_ARTIKUJT t 
      JOIN (SELECT @rownum := NULL, @category := '') r 
     ORDER BY t.category) x 
WHERE x.rank <= 3 

如果你不改變SELECT x.*,結果集將包括rankvar_category值 - 如果情況並非如此,您必須指定您真正想要的列。

+0

運行完美,這就是我需要的 – AXheladini 2010-06-30 08:21:57

+0

我可以從這個選擇創建視圖在某些方面,我嘗試,但它說:1349 - 視圖的SELECT語句包含在FROM子句中 – AXheladini 2010-06-30 09:04:51

+1

@AXheladini子查詢:對不起,MySQL的贏不允許出於幾個原因 - 使用變量的子查詢... MySQL視圖受到極其嚴格的限制,我擔心 - 它們會在CREATE VIEW文檔中列出限制條件:http://dev.mysql.com/doc/ refman/5.1/en/create-view.html – 2010-06-30 15:04:19

-3

使用group by而不是order by。

0
SELECT * FROM ( 
    SELECT VD.`cat_id` , 
     @cat_count := IF((@cat_id = VD.`cat_id`), @cat_count + 1, 1) AS 'DUMMY1', 
     @cat_id := VD.`cat_id` AS 'DUMMY2', 
     @cat_count AS 'CAT_COUNT' 
    FROM videos VD 
    INNER JOIN categories CT ON CT.`cat_id` = VD.`cat_id` 
     ,(SELECT @cat_count :=1, @cat_id :=-1) AS CID 
    ORDER BY VD.`cat_id` ASC) AS `CAT_DETAILS` 
    WHERE `CAT_COUNT` < 4 

------- STEP FOLLOW ---------- 
1 . select * from ('FILTER_DATA_HERE') WHERE 'COLUMN_COUNT_CONDITION_HERE' 
2. 'FILTER_DATA_HERE' 
    1. pass 2 variable @cat_count=1 and @cat_id = -1 
    2. If (@cat_id "match" column_cat_id value) 
     Then @cat_count = @cat_count + 1  
     ELSE @cat_count = 1  
    3. SET @cat_id = column_cat_id  

3. 'COLUMN_COUNT_CONDITION_HERE' 
    1. count_column < count_number  

4. ' EXTRA THING ' 
    1. If you want to execute more than one statement inside " if stmt " 
    2. IF(condition, stmt1 , stmt2) 
     1. stmt1 :- CONCAT(exp1, exp2, exp3) 
     2. stmt2 :- CONCAT(exp1, exp2, exp3) 
    3. Final "If" Stmt LIKE 
     1. IF (condition , CONCAT(exp1, exp2, exp3) , CONCAT(exp1, exp2, exp3))  
share