Запрос PostgreSQL для поиска строк с соответствующими данными и объединения столбцов из этих строк - PullRequest
0 голосов
/ 13 октября 2018

Я использую 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 голосов
/ 13 октября 2018

То, что вы ищете, это самостоятельное соединение:

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
0 голосов
/ 13 октября 2018

Типичное объединение будет:

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

Если вы хотите избежать повторения кортежей, измените условие WHERE, например:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...