2014-11-13 7 views
2

У меня есть следующая таблица и некоторые примеры записей в нем: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, где меня попросили открыть новый.

ответ

2

Я думаю, что это делает то, что вы описали:

select least(attr1_id, attr2_id) as attr1, greatest(attr1_id, attr2_id) as attr2 
from table t 
group by least(attr1_id, attr2_id), greatest(attr1_id, attr2_id) 
having bool_and(rating_d = 1) ; 

Я не понимаю, другие таблицы в запросе, потому что ваш старт с одной таблицей, которая имеет все, что вам нужно.

+0

Большое вам спасибо, это было именно так. Я оставил другие таблицы там, чтобы показать, что я делаю JOIN, на всякий случай, что могло бы иметь какой-то эффект. Мои знания о Postgres довольно ограничены, поэтому я не был уверен. Еще раз спасибо за вашу помощь! – doque

Смежные вопросы