PostgreSQL查询以查找具有匹配数据的行并合并这些行中的列

时间:2018-10-13 17:17:29

标签: sql postgresql

我正在使用PostgreSQL,并有一个类似这样的表,该表显示用户,项目以及用户给定项目的评分(用户可以为特定项目提供多个评分):

  name   |    item   | score
---------+-----------+-------
 user_1  |  item_1   |  3
 user_1  |  item_2   |  2
 user_1  |  item_3   |  3
 user_1  |  item_4   |  4
 user_1  |  item_1   |  5
 user_2  |  item_1   |  5
 user_2  |  item_2   |  2
 user_3  |  item_3   |  1
 user_4  |  item_3   |  1

我要查询以下内容:1)选择两个不同用户给予相同分数的项目,2)以以下形式打印结果:

  name1  |   name2  |  item  | score
---------+----------+--------+-------
 user_1  |  user_2  | item_1 |   5
 user_2  |  user_1  | item_1 |   5
 user_1  |  user_2  | item_2 |   2
 user_2  |  user_1  | item_2 |   2
 user_3  |  user_4  | item_3 |   1
 user_4  |  user_3  | item_3 |   1

我什至没有找到解决方案。如何根据特定条件(在这种情况下,需要具有相同分数的共同项目)为条件选择两次以不同值将用户列选择到一个结果行中。然后如何为下一行获取相同的两个用户值,但顺序不同。

任何帮助将不胜感激,谢谢!

2 个答案:

答案 0 :(得分:0)

典型的联接可以做到:

aws_ami

如果要避免重复元组,请更改user_data条件,如下所示:

select 
    t1.name, t2.name, t1.item, t1.score
  from mytable t1
  join mytable t2 on t1.item = t2.item and t1.score = t2.score
  where t1.name <> t2.name

答案 1 :(得分:0)

您要寻找的是自我加入:

SELECT a.name AS name1, b.name AS name2, a.item, a.score
FROM table a INNER JOIN table b
ON a.item = b.item AND a.score = b.score
WHERE a.name != b.name