2010-07-26 38 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的记录。

相关问题