2010-07-26 74 views
0

我有一個非常簡單的任務,但找不到任何解決方案。我有兩個表,「文章」和「分類」如何排除在一個字段中有重複的行

我的文章的表是這樣的:

id | cat_id | title | content 
1  1  Blah  Content 1 
2  1  Blah2 Content 2 
3  2  Blah3 Content 3 

我的類別表是這樣的:

id | title 
1  Category 1 
2  Category 2 

你看,我有2篇文章具有相同的cat_id。我不想重複cat_id字段。我無法使用DISTINCT,因爲我會收到所有文章,因爲我希望所有字段都已排除。

所以如果我使用DISTINCT這樣的:

SELECT DISTINCT a.id,a.cat_id,a.title,a.content從文章的AS一

我會得到所有的東西,但我想像這樣的輸出

id | cat_id | title | content 
2  1  Blah2 Content 2 
3  2  Blah3 Content 3 

有人可以幫助我!!!

+0

對不起 - 我看不到ARTICLE.ID值1和2是同一篇文章。這些ID是不同的,正如標題... – 2010-07-26 20:40:15

+1

你如何決定你想要的貓1的兩行中的哪一行? – Tom 2010-07-26 20:41:35

回答

0

該查詢將選擇從每個類別

SELECT a.* FROM Article a LEFT JOIN 
    Article a2 ON a.id<a2.id AND a.cat_id=a2.cat_id 
WHERE a2.id IS NULL 

它的外表與所有其他條款加入的第一篇文章(最低ID)。連接子句只能連接具有相同類別和較小ID的文章。當沒有匹配時(a2.id爲NULL),那麼我們就會得到該類別ID最低的文章。

+0

就是這樣,你能解釋我是如何工作的嗎? – Tjodalv 2010-07-26 20:48:36

+0

我已經在查詢後的段落中盡我所能地解釋過。我可以嘗試詳細說明 - 哪一部分你有麻煩? – mdma 2010-07-26 20:57:00

0

沒有測試,但應該工作:

; WITH cte AS (
    SELECT 
     * 
     ,ROW_NUMBER() OVER (PARTITION BY cat_id ORDER BY id DESC) AS RowNum 
) 
SELECT 
    * 
FROM cte 
WHERE RowNum = 1; 
0

嘗試這種情況:

select article.* 
    from article 
     join (select min(id) as id, cat_id from article group by cat_id) a2 
      using (id); 

或:

select * 
    from article 
    where id in (select min(id) from article group by cat_id); 

兩種選擇一個物品ID(使用分())爲每個不同的CAT_ID並只選擇與這些ID的記錄。

相關問題