Sql Group by表示除一个列之外的所有列的行

时间:2011-11-07 16:35:05

标签: c# sql group-by subsonic grouping

我有一个包含多个列的表,用于保存用户存储的搜索。

每天都需要发送包含最新搜索结果的电子邮件。 可能有数千个已保存的搜索。

我保存的搜索表中的列类似如下:

Id 
userEmail 
SearchParam1 
SearchParam2 
SearchParam3

由于会有这么多的搜索,我预计会有很多相同的搜索,所以我想得到param1,2和3相同的每一行,但仍然可以访问用户的电子邮件,这样我就可以发送相同的结果,无需多次运行相同的搜索。

理想情况下,我喜欢这样的事情:

SearchParam1, SearchParam2, SearchParam3
|
|____Email1
|
|____Email2
|
|____Email3

按搜索参数分组的类型,但链接到电子邮件的一些方式。

我甚至不知道从哪里开始,因此我没有添加任何代码。 谁能给我一些建议?

修改 只是为了澄清。一张电子邮件在表格中不会存在多次。因此从技术上讲,他们每人只能保存1次搜索。

没有这样的用户,只是电子邮件地址。

贝克斯

2 个答案:

答案 0 :(得分:1)

您真正应该考虑的是数据规范化。这看起来像是一对多的关系,所以这样的结构就是这样的想法:

create table yourUsersTable
(
    id int identity(1, 1) primary key clustered not null,
    name varchar(1000) not null,
    email varchar(1000) not null
)
go

create table searchParams
(
    id int identity(1, 1) primary key clustered not null,
    searchText varchar(1000) not null
)
go

create table userSearchParams
(
    fkYourUsersTable int not null references yourUsersTable(id),
    fkSearchParams int not null references searchParams(id)
)
go

这样,如果您想获得订阅搜索参数的用户的所有电子邮件地址,那么这将是一个简单的查询:

select u.email
from yourUsersTable u
inner join userSearchParams up
on u.id = up.fkYourUsersTable
inner join searchParams p
on p.id = up.fkSearchParams
where p.searchText = 'your search parameter here'

这是使用多对多关系实现数据规范化的基本示例。它利用连接表来创建用户和搜索参数之间的关系。使用上述设计,数据检索变得更加简单,并且您不会受到原始非规范化数据(包括searchParam1searchParam2等列)的限制。

如果有意义,请告诉我。

答案 1 :(得分:0)

在SQL中,起点是:

select SearchParam1, SearchParam2, SearchParam3, userEmail, count(*) query_count
from MyTable
group by SearchParam1, SearchParam2, SearchParam3, userEmail
order by 1,2,3,4

(如果您不想查看同一用户运行同一查询的次数,您可以省略group by子句和count(*)项,只需包含select distinct来代替。)

这将在每个用户的电子邮件旁边重复搜索参数。

如果您希望每次其中一个更改时仅将搜索参数包含为标题,我建议在报表工具(如SQLServer报表服务)中使用上述查询 - 对搜索参数进行分组,包括参数字段仅在组头中,并且仅在详细信息行中包含用户电子邮件。

编辑:如果userEmail唯一标识记录,则查询可以简化为:

select SearchParam1, SearchParam2, SearchParam3, userEmail
from MyTable
order by 1,2,3,4