У меня есть следующая таблица и некоторые примеры записей в нем:PostgreSQL - Выберите отчетливый (column1, COLUMN2), где условие
id | attr1_id | attr2_id | user_id | rating_id |
------+----------+----------+-------------------+-----------+
1 | 188 | 201 | [email protected] | 3 |
2 | 193 | 201 | [email protected] | 2 |
3 | 193 | 201 | [email protected] | 1 |
4 | 194 | 201 | [email protected] | 1 |
5 | 194 | 201 | [email protected] | 1 |
6 | 192 | 201 | [email protected] | 1 |
Сочетание (attr1_id
, attr2_id
, user_id
) является UNIQUE
, то есть каждый пользователь может создать только одну запись с определенной парой идентификаторов атрибутов.
Моя цель состоит в том, чтобы выбрать все различные комбинации (attr1_id, attr2_id), где rating_id = 1
, но только выбрать каждый combiniation из attr1_id
и attr2_id
только один раз, и только там, где не существует какой-либо другой строки (другими пользователями) имеют rating_id > 1
и обратитесь к тем же attr1_id
и attr2_id
. Обратите внимание, что сочетание attr1_id
и attr2_id
может быть переключен вокруг, так что с учетом этих двух записей:
id | attr1_id | attr2_id | user_id | rating_id | override_comment
------+----------+----------+--------------------+-----------+------------------
20 | 5 | 2 | [email protected] | 3 |
------+----------+----------+--------------------+-----------+------------------
21 | 2 | 5 | [email protected] | 1 |
ни одна строка должна быть подсчитаны, так как строки относятся к одной и той же комбинации attr_ids
и один из них имеет rating_id > 1
.
Однако, если существуют эти две строки:
id | attr1_id | attr2_id | user_id | rating_id | override_comment
------+----------+----------+--------------------+-----------+------------------
20 | 5 | 2 | [email protected] | 1 |
------+----------+----------+--------------------+-----------+------------------
21 | 2 | 5 | [email protected] | 1 |
------+----------+----------+--------------------+-----------+------------------
22 | 2 | 5 | [email protected] | 1 |
все строки должны учитываться только один, потому что все они имеют то же самое сочетание attr1_id
и attr2_id
и все они имеют rating_id = 1
.
Кроме того, есть присоединение и фильтрация с помощью объединенного столбца таблицы, который я оставлю, но я думал, что упомянул об этом в любом случае.
SQL Скрипки не работает для меня прямо сейчас, но у меня uploaded some sample data from the compatibility table.
Мой запрос до сих пор это:
SELECT distinct(a1, a2),
a1,
a2
FROM
(SELECT c.*,
least(attr1_id, attr2_id) AS a1,
greatest(attr1_id, attr2_id) AS a2
FROM compatibility c
JOIN attribute a ON c.attr1_id = a.id
JOIN PARAMETER pa ON a.parameter_id = pa.id
JOIN problem p ON pa.problem_id = p.id
WHERE p.id = 1
GROUP BY 1,
2 HAVING NOT bool_or(rating_id > 1)) s;
В образце, есть в общей сложности 144 рейтинги. Каждый пользователь создал 7 рейтингов, которые имеют rating_id > 1
и тех 14 оценок, 2 относятся к тому же набору (attr1_id
, attr2_id
). Следовательно, число, которое я ищу, будет (77-12) = 65
. Однако, результат здесь, кажется, 77-2 = 75
. Таким образом, только строки, где существуют два рейтинга с одинаковыми идентификаторами атрибутов, отбрасываются.
Я также указал бы my previous question for this matter, где меня попросили открыть новый.
Большое вам спасибо, это было именно так. Я оставил другие таблицы там, чтобы показать, что я делаю JOIN, на всякий случай, что могло бы иметь какой-то эффект. Мои знания о Postgres довольно ограничены, поэтому я не был уверен. Еще раз спасибо за вашу помощь! – doque