объединение одинаковых строк с двумя одинаковыми значениями - PullRequest
0 голосов
/ 12 октября 2018

У меня есть три таблицы: пользователи, продукты и отзывы.Я пытаюсь составить таблицу, в которой были бы показаны продукты, которые получили одинаковый отзыв от разных пользователей, пользователей, которые его просмотрели, и какой обзор он получил.Вот таблицы и вывод, который я ищу:

Users  
uid  uname
1    name1  
2    name2  
3    name3  
4    name4

Products
pid  pname  
1    A  
2    B  
3    C  
4    D  

Reviews   
pid  uid  grade  
1    1    3  
1    2    2  
1    3    3  
2    1    4  
3    2    1  
2    2    4  
4    3    1  

Желаемый вывод:

uname  uname2  pname  grade  
name1  name3   A      3  
name3  name1   A      3  
name1  name2   B      4  
name2  name1   B      4

Ответы [ 3 ]

0 голосов
/ 12 октября 2018

Это можно сделать с помощью самоподсоединения, например:

with combined as 
    (select (select uname from users where uid = r.uid), 
        (select pname from products where pid = r.pid), 
        r.grade,
        r.uid 
        from reviews r)
select c1.uname as name1, c2.uname as name2, c1.pname, c1.grade
    from combined c1, combined c2
    where c1.grade = c2.grade
    and c1.pname = c2.pname
    and c1.uid <> c2.uid;
0 голосов
/ 12 октября 2018

Здесь есть несколько слишком сложных ответов.

Это довольно просто, используя самостоятельное соединение, как это:

select u1.uname, u2.uname, p.pname, r1.grade
from review r1
join review r2 on r2.pid=r1.pid and r2.grade=r1.grade and r2.uid<>r1.uid
join products p on p.pid=r1.pid
join users u1 on u1.uid=r1.uid
join users u2 on u2.uid=r2.uid
order by pname, r1.grade, u1.uname, u2.uname

Результат:

uname   uname1  pname   grade
name1   name3   A       3
name3   name1   A       3
name1   name2   B       4
name2   name1   B       4
0 голосов
/ 12 октября 2018
select users.uname, reviews.grade, products.pname from products
join reviews on products.id = reviews.pid
join users on users.id = reviews.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...