sql - 将相似的行与两个相同的值组合起来

标签 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

最佳答案

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

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

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

关于sql - 将相似的行与两个相同的值组合起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52773369/

相关文章:

mysql - UNION ALL mysql 子句中的行默认顺序?..我的意思是首先获取哪一行?

php - 处理几个不同的表单输入字段 php

SQL 表不遵守其唯一约束

c++ - 测量使用预编译库(C++、Linux)的程序的总 CPU 时间

sql - AWS MS SQL 创建表

django - 按差和排序

sql - 从一个数据组创建 N 个数组的函数

python - 为什么 Django 创建带有时区的 Postgres 时间戳列?

SQL: "BETWEEN"与 "current_date - number"之间的区别

PHP:根据不同表的值在15分钟后删除记录