如何从所有搜索项中仅选择一项?

时间:2014-09-11 16:26:12

标签: search


我有一个数据集:

Group    Owner
ABC      John
ABC
TTT
TTT
TTT
CBS      Alen
CBS      Tim
SGD
SGD

现在我需要搜索数据集以查找其所有者全部为空的所有行,例如TTT和SGD(不是ABC,因为它有一个所有者为John的行)。但我只需要选择一个项目而不是全部(第一个更好)。我怎么能用c#?

来做到这一点

1 个答案:

答案 0 :(得分:0)

由于您尚未指定数据库,我将在sqlfiddle.com中使用MySQL5.6,但该方法很可能在任何关系数据库中都相似。

首先,让我们设置架构:

create table x (grp varchar(10), ownr varchar(10), row int);
insert into x (grp, ownr, row) values ('abc', 'john', 1);
insert into x (grp, ownr, row) values ('abc', '', 2);
insert into x (grp, ownr, row) values ('ttt', '', 3);
insert into x (grp, ownr, row) values ('ttt', '', 4);
insert into x (grp, ownr, row) values ('ttt', '', 5);
insert into x (grp, ownr, row) values ('cbs', 'alan', 6);
insert into x (grp, ownr, row) values ('cbs', 'tim', 7);
insert into x (grp, ownr, row) values ('sgd', '', 8);
insert into x (grp, ownr, row) values ('sgd', '', 9);

第一步是获取输出中想要的组列表。对此的查询将是:

select distinct grp from x where ownr <> ''

grp
---
abc
cbs

那么你只需要一个包含其他组的行,而不是那些(我也在这里按行排序):

select * from x where grp not in (
    select distinct grp from x where ownr <> ''
) order by row

这会让你获得所有其他行:

grp  ownr  row
---  ----  ---
ttt          3
ttt          4
ttt          5
sgd          8
sgd          9

现在,它变得略微不清楚你想要什么。如果您只想要整个集合中的第一个,您可以简单地使用限制条款,例如:

select * from x where grp not in (
    select distinct grp from x where ownr <> ''
) order by row limit 1

grp  ownr  row
---  ----  ---
ttt          3

但是,如果您需要每个组的第一个,则可以使用聚合子句完成,如下所示:

select grp, '' as ownr, min(row) as row
from x where grp not in (
    select distinct grp from x where ownr <> ''
) group by grp

grp  ownr  row
---  ----  ---
sgd          8
ttt          3

显然我对以下事情做了一些假设:

  • 空主人是什么;
  • 你认为每个子集的“第一”是什么;和
  • 您用于后端的数据库。

但即使需要修改这些假设,一般方法仍应保持不变。