我正在创建一个文件组织系统,您可以在其中将内容项添加到多个文件夹中。 我将数据存储在具有类似于以下结构的表中:
ID TypeID ContentID FolderID
1 101 1001 1
2 101 1001 2
3 102 1002 3
4 103 1002 2
5 103 1002 1
6 104 1001 1
7 105 1005 2
我正在尝试为每个唯一的TypeID和ContentID对选择第一条记录。对于上表,我希望结果为:
ID
1
3
4
6
7
正如你所看到的,对101 1001和103 1002分别被添加到两个文件夹中,但我只想要记录它们被添加到的第一个文件夹。
但是,当我尝试以下查询时,我只得到至少有两个具有相同TypeID和ContentID的条目的结果:
select MIN(ID)
from table
group by TypeID, ContentID
结果
ID
1
4
如果我将MIN(ID)
更改为MAX(ID)
,我会得到正确数量的结果,但我会将记录添加到最后一个文件夹中,而不是第一个文件夹:
ID
2
3
5
6
7
我使用GROUP BY
还是MIN
错了?还有另一种方法可以完成选择每个TypeID ContentID对的第一条记录的任务吗?
答案 0 :(得分:1)
与ORDER BY:
一起使用select *
from table
group by TypeID, ContentID
order by id
SQLFiddle:http://sqlfiddle.com/#!9/024016/12
答案 1 :(得分:1)
使用ROW_NUMBER
WITH CTE AS
(SELECT ID,TypeID,ContentID,FolderID,
ROW_NUMBER() OVER (PARTITION BY TypeID,ContentID ORDER BY ID) as rn FROM t
)
SELECT ID FROM CTE WHERE rn=1
答案 2 :(得分:1)
MIN()
和MAX()
应返回相同数量的行。更改函数应该不更改查询中返回的行数。
此查询是否是较大查询的一部分?通过查看提供的示例数据,我认为此代码只是您尝试执行的更大操作的片段。您是否稍后尝试加入TypeID
,ContentID
或FolderID
与ID引用的表格?
如果是,则此错误可能是由查询的另一部分而不是此select语句引起的。如果使用连接或多级选择语句,如果引用表不包含所有外部ID的记录,则可以获得不同的结果量。
另一个建议是,检查记录中的任何值是否为NULL
。虽然这不应该影响GROUP BY
,但在处理NULL
值时,我有时会遇到奇怪的行为。
答案 3 :(得分:0)
尝试使用first(id)而不是min(id)
先选择(id) 从表 按类型ID分组,ContentID
有效吗?