2011-11-07 28 views
2

我有一個表的列數將被用來保存用戶存儲的搜索。Sql分組由所有列相同的行除了一個

每天都需要發送一封包含最新搜索結果的電子郵件。 可能有成千上萬的保存搜索。

我在我保存的搜索表列類似如下:

Id 
userEmail 
SearchParam1 
SearchParam2 
SearchParam3 

一樣,還會有這麼多的搜索我預計會有許多是相同的,所以我想獲得的所有行上參數1,2和3是相同的,但仍可以訪問用戶的電子郵件,因此我可以將相同的結果發送給每個人,而無需多次運行相同的搜索。

理想情況下,我想是這樣的背:

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

的由搜索PARAMS分組,但聯繫到電子郵件一些怎麼樣。

我甚至不知道從哪裏開始,因此我沒有添加任何代碼。 任何人都可以給我一些建議嗎?

編輯 只是爲了澄清。一張電子郵件在表格中不會存在多次。所以從技術上講,他們只允許每個保存1次搜索。

沒有用戶,只是電子郵件地址。

Bex

+0

爲什麼不包括USEREMAIL的組通過英寸 –

+0

電子郵件將有所不同,所以如果3行是相同的,但具有不同的電子郵件將不只是選擇爲3個單獨的行?除非我錯過了什麼? – Bex

+0

@Bex:所以沒有用戶會運行多個查詢? (或'userEmail'表示用戶的電子郵件地址以外的東西?) –

回答

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等列)的限制。

請讓我知道,如果這是有道理的。

+0

這確實有道理,但我不確定它是否會起作用,或者我的理解不正確。我有10個命名搜索參數,即位置lat,位置long,categoryId等...所以where子句不能存在。我需要將他們分組?我肯定錯過了什麼? – Bex

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 
+0

我已經稍微編輯了我的問題。電子郵件在表格中不會存在多次。如果我分組不會只是給每個電子郵件一個單獨的行?這些參數可能是相同的,但電子郵件永遠不會。 – Bex

相關問題