Как объединить 2 строки по 2 внешним ключам в SQL Workbench? - PullRequest
0 голосов
/ 27 апреля 2020

Итак, у меня есть база данных, где у меня двойное соединение между двумя таблицами. How it looks on my er diagram

И теперь я должен выяснить, какие 2 человека отправили больше всего сообщений друг другу.

Что я и сделал так:

 create view temp as select Uporabnik_idUporabnik1,Uporabnik_idUporabnik2, count(Sporocilo.id) as 
 st_sporocil from Sporocilo group by Sporocilo.Uporabnik_idUporabnik1, 
 Sporocilo.Uporabnik_idUporabnik2; select * from temp;

Проблема в том, что это учитывает только одностороннюю связь. Таким образом, он будет подсчитывать, сколько сообщений user1 отправлено user2 и сколько сообщений user2 отправлено user1 в виде двух разных строк. Example of how it looks

Итак, как мне объединить строки, где row1 fk1 = row2 fk2 и row2 fk1 = row1 fk2?

1 Ответ

0 голосов
/ 27 апреля 2020
 create view temp as
 select Uporabnik_idUporabnik1,Uporabnik_idUporabnik2,count(idSporocilo) as st_sporocil   
 FROM 
  ( SELECT Uporabnik_idUporabnik1,Uporabnik_idUporabnik2,idSporocilo from Sporocilo 
    UNION 
    SELECT Uporabnik_idUporabnik2,Uporabnik_idUporabnik1,idSporocilo from Sporocilo 
  ) t
WHERE Uporabnik_idUporabnik1 > Uporabnik_idUporabnik2
GROUP BY Uporabnik_idUporabnik1,Uporabnik_idUporabnik2

UNION с обратным получит количество двусторонних сообщений. Потому что вы будете группировать отправителя, получателя и получателя, отправителя. Проблема сейчас в том, что вы все равно получите два ряда. F.ex:

Uporabnik_idUporabnik1,Uporabnik_idUporabnik2,st_sporocil
1,10,4
10,1,4

Чтобы показать только одну строку, я добавил фильтр Uporabnik_idUporabnik1 > Uporabnik_idUporabnik2, который покажет только первую строку. Будьте осторожны, потому что это подавит разговоры с самим собой (где отправитель совпадает с получателем)

...