我有一个包含多个列的表,用于保存用户存储的搜索。
每天都需要发送包含最新搜索结果的电子邮件。 可能有数千个已保存的搜索。
我保存的搜索表中的列类似如下:
Id
userEmail
SearchParam1
SearchParam2
SearchParam3
由于会有这么多的搜索,我预计会有很多相同的搜索,所以我想得到param1,2和3相同的每一行,但仍然可以访问用户的电子邮件,这样我就可以发送相同的结果,无需多次运行相同的搜索。
理想情况下,我喜欢这样的事情:
SearchParam1, SearchParam2, SearchParam3
|
|____Email1
|
|____Email2
|
|____Email3
按搜索参数分组的类型,但链接到电子邮件的一些方式。
我甚至不知道从哪里开始,因此我没有添加任何代码。 谁能给我一些建议?
修改 只是为了澄清。一张电子邮件在表格中不会存在多次。因此从技术上讲,他们每人只能保存1次搜索。
没有这样的用户,只是电子邮件地址。
贝克斯
答案 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'
这是使用多对多关系实现数据规范化的基本示例。它利用连接表来创建用户和搜索参数之间的关系。使用上述设计,数据检索变得更加简单,并且您不会受到原始非规范化数据(包括searchParam1
,searchParam2
等列)的限制。
如果有意义,请告诉我。
答案 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