2013-05-07 129 views
2

enter image description hereMySQL查詢訂購

這是我的數據。我想採用6行,但我希望所有HeadlineCategoryId在我的結果列表中都是唯一的。如果我選擇前6名,我會從HeadlineCategoryID 20(6,2)中取2排。你有什麼建議嗎?

+0

真的是你使用哪個服務器? MySQL或SQL服務器?如果你拿到前6,它會返回兩個'20',你想得到什麼記錄? '2'還是'6'? – 2013-05-07 13:42:38

+0

@JW웃你可以明白我的問題的標題我使用MySQL ......我不想讓2條記錄的20 – cagin 2013-05-07 13:44:20

+0

什麼決定你想要的NewSID的/創建的副本headlinecategoryids? – ysth 2013-05-07 13:57:29

回答

2
SELECT a.* 
FROM tableName a 
     INNER JOIN 
     (
      SELECT HeadlineCategoryID, MAX(Creation) max_date 
      FROM TableName 
      GROUP BY HeadlineCategoryID 
     ) b ON a.HeadlineCategoryID = b.HeadlineCategoryID AND 
       a.Creation = b.max_date 
ORDER BY a.Creation DESC -- << specify here how are you going to sort 
LIMIT 6     -- the records you want to get 

更新1

SELECT a.* 
FROM tableName a 
     INNER JOIN 
     (
      SELECT HeadlineCategoryID, MAX(NewsID) max_id 
      FROM TableName 
      GROUP BY HeadlineCategoryID 
     ) b ON a.HeadlineCategoryID = b.HeadlineCategoryID AND 
       a.NewsID = b.max_id 
ORDER BY a.Creation DESC -- << specify here how are you going to sort 
LIMIT 6     -- the records you want to get 
+0

我也厭倦了您的查詢,但它與Gordon的答案是相同的結果。 – cagin 2013-05-07 13:55:38

+0

由於'Creation'是相同的,請嘗試使用'NewdID'來更改它。我會更新答案。 – 2013-05-07 13:57:11

+0

再試一次...... – 2013-05-07 13:57:54

0

它看起來像你想的六個最近的記錄,但HeadlineCategoryId獨特。如果是這樣,這將工作:

select top 6 NewsId, Creation, HeadlineCategoryId 
from (select t.*, 
      row_number() over (partition by HeadlineCategoryId order by Creation desc) as seqnum 
     from t 
    ) t 
where seqnum = 1 

作爲一個說明。 。 。這個問題最初表明它使用的是SQL Server,而不是MySQL。 MySQL中的解決方案並不那麼簡單。這裏有一個方法與not exists

select NewsId, Creation, HeadlineCategoryId 
from t 
where not exists (select 1 
        from t t2 
        where t2.HeadlineCategoryId = t.HeadlineCategoryId and 
         t2.id < t.id) 
limit 6 

not exists部分說:「那裏沒有其他記錄與給定標題類別更大的ID」。

+0

它給出6條記錄,但20條仍有2條記錄。 – cagin 2013-05-07 13:55:10

+0

dups的創建時間是相同的 – ysth 2013-05-07 13:55:57