将相似的行与两个相同的值组合

时间:2018-10-12 06:15:10

标签: sql postgresql

我有三个表:用户,产品和评论。我正在尝试形成一个表格,该表格将显示获得不同用户,相同评论的用户以及获得哪些评论的产品的评论。 这是我要查找的表和输出:

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 :(得分:1)

这里有一些过于复杂的答案。

使用这样的自连接非常简单:

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

答案 1 :(得分:0)

select users.uname, reviews.grade, products.pname from products
join reviews on products.id = reviews.pid
join users on users.id = reviews.id

答案 2 :(得分:0)

这可以使用像这样的自连接完成-

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;