Соединение SQL для 4 таблиц не возвращает правильное количество - PullRequest
0 голосов
/ 01 мая 2018

у меня 4 таблицы.

Последовательность

id -> primary key
name 
user_id -> foreign key   (users id)

человек:

id-> primary key
name-> varchar
seq_id -> foreign key from sequences
user_id -> foreign key from users

links_clicked:

id-> primary key
src_id -> foreign key (sequences id)
views -> Boolean

people_sequence

sequence_id-> foreign key   (sequences id)
people_id ->  foreign key   (people id)

Мне нужно получить подробную информацию о последовательностях, количество кликов по ссылкам из таблицы ссылок, количество людей, если там указан seq_id, и количество последовательностей из последовательности из таблицы people_sequence. Я думаю, что мне нужно использовать левые соединения, и я написал запрос, как показано ниже:

SELECT  sequences.*
       ,sum(link_clicked.view) as click_rate 
       ,count(people.seq_id) as prospect 
       ,count(people_sequences.sequence_id) as seqret 
FROM sequences 
LEFT JOIN link_clicked ON sequences.id=link_clicked.src_id 
LEFT JOIN people ON sequences.id=people.seq_id
LEFT JOIN people_sequences ON sequences.id=people_sequences.sequence_id
where sequences.user_id = 1
group by sequences.id

но это возвращает количество для каждого из столбцов подсчета как то же самое

Невозможно понять, что не так с SQL

id            | name |  user_id |click_rate |   prospect|seqret
5ac77be52d06e | seq1 |1         | 414       |    1890   | 1890
5ae790b48fea9 | seq2 |1         | 8         |    43     | 0
5ae790b6e0b12 | seq3 |1         | 2         |    0      | 0
5ae835c5153b5 | seq4 |1         | NULL      |    0      | 0

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

SELECT `src_id` ,sum(`view`) FROM `link_clicked ` group by src_id

src_id         | sum(`view`)
5ac77be52d06e  | 23
5ae790b48fea9  | 8
5ae790b6e0b12  |2

1 Ответ

0 голосов
/ 05 мая 2018

Я думаю, что эти оставленные объединения отправят ваши результаты сумасшедшим ... вы получите несколько повторяющихся записей для всего, поскольку все перестановки объединений генерируются как результаты, приводящие к бессмысленным суммам / счетам. Чтобы увидеть все повторяющиеся результаты, удалите агрегацию, и вы получите очень длинный повторяющийся и вводящий в заблуждение список. Попробуйте 3 подзапроса?

SELECT S.*
       ,(SELECT COUNT(IIF([view], 1, 0)) FROM link_clicked WHERE src_id=S.id) click_rate
       ,(SELECT COUNT(*) FROM people WHERE seq_id=S.id) prospect
       ,(SELECT COUNT(*) FROM people_sequences WHERE sequence_id=S.id) seqret
FROM sequences S
WHERE S.user_id=1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...