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:

从文章中选择 DISTINCT a.id、a.cat_id、a.title、a.content 作为 a

我会把所有东西都拿出来,但我想要这样的输出

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

有人能帮助我吗 !!!

4

3 回答 3

0

此查询将从每个类别中选择第一篇文章(最低 id)

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

它与所有其他文章进行外部连接。join 子句只连接具有相同类别且 ID 较小的文章。当没有匹配项(a2.id 为 NULL)时,我们将获得该类别 ID 最低的文章。

于 2010-07-26T20:41:45.057 回答
0

未经测试,但应该可以工作:

; WITH cte AS (
   SELECT
      *
      ,ROW_NUMBER() OVER (PARTITION BY cat_id ORDER BY id DESC) AS RowNum
)
SELECT
   *
FROM cte
WHERE RowNum = 1;
于 2010-07-26T20:40:46.260 回答
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);

两者都为每个不同的 cat_id 选择一个文章 id(使用 min()),并且只选择具有这些 id 的记录。

于 2010-07-26T20:59:49.213 回答