Sql Группировать по строкам со всеми одинаковыми столбцами, кроме одного - PullRequest
2 голосов
/ 07 ноября 2011

У меня есть таблица с несколькими столбцами, которые будут использоваться для сохранения результатов поиска, сохраненных пользователем.

Каждый день необходимо отправлять электронные письма, содержащие последние результаты поиска.Сохраненных поисков может быть тысячи.

Мои столбцы в моей сохраненной таблице поиска похожи на следующие:

Id 
userEmail 
SearchParam1 
SearchParam2 
SearchParam3

Поскольку будет так много поисков, я ожидаю, что будет многоодинаковы, поэтому я хотел бы получить все строки, в которых param1,2 и 3 одинаковы, но все еще имеют доступ к электронной почте пользователей, поэтому я могу отправлять одинаковые результаты каждому без необходимости выполнять один и тот же поиск несколько раз.

В идеале я бы хотел что-то вроде этого:

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

Вид сгруппирован по параметрам поиска, но каким-то образом связан с электронными письмами.

Я даже не знаю, гдедля начала, поэтому я не добавил ни одного кода.Кто-нибудь может дать мне несколько советов?

РЕДАКТИРОВАТЬ Просто чтобы уточнить.Одно электронное письмо не может существовать более одного раза в таблице.Технически им разрешено сохранять только 1 запрос на поиск.

Пользователей как таковых нет, только адреса электронной почты.

Bex

Ответы [ 2 ]

1 голос
/ 07 ноября 2011

То, что вы действительно должны учитывать, это нормализация данных.Это выглядит как отношение «многие ко многим», поэтому такая структура была бы идеей:

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 голосов
/ 07 ноября 2011

В 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
...