我有以下表格和其中一些示例记录:
id | attr1_id | attr2_id | user_id | rating_id | override_comment
------+----------+----------+-------------------+-----------+------------------
1 | 188 | 201 | user_1@domain.com | 3 |
2 | 193 | 201 | user_2@domain.com | 2 |
3 | 193 | 201 | user_2@domain.com | 1 |
4 | 194 | 201 | user_2@domain.com | 1 |
5 | 194 | 201 | user_1@domain.com | 1 |
6 | 192 | 201 | user_2@domain.com | 1 |
(
attr1_id
, attr2_id
, user_id
)的组合是UNIQUE
,这意味着每个用户只能使用一对特定的属性ID创建一条记录。我的目标是统计
rating_id = 1
的行数,但是每个attr1_id
和attr2_id
组合只计算一次,并且仅在不存在其他用户引用相同的attr1_id
和attr2_id
的rating_id > 1
的行时才计算。请注意,attr1_id
和attr2_id
的组合可以交换位置,所以考虑以下两个记录: id | attr1_id | attr2_id | user_id | rating_id | override_comment
------+----------+----------+--------------------+-----------+------------------
20 | 5 | 2 | user_1@domain.com | 3 |
------+----------+----------+--------------------+-----------+------------------
21 | 2 | 5 | user_2@domain.com | 1 |
不应计算任何一行,因为这些行指向相同的 attr_ids
结合,并且其中一个具有 rating_id > 1
。
如果存在以下两行,则:
id | attr1_id | attr2_id | user_id | rating_id | override_comment
------+----------+----------+--------------------+-----------+------------------
20 | 5 | 2 | user_1@domain.com | 1 |
------+----------+----------+--------------------+-----------+------------------
21 | 2 | 5 | user_2@domain.com | 1 |
------+----------+----------+--------------------+-----------+------------------
22 | 2 | 5 | user_3@domain.com | 1 |
所有行都应该被视为一行,因为它们都共享相同的 attr1_id
和 attr2_id
组合,并且所有行都具有 rating_id = 1
。
到目前为止,我的方法是这样的,但结果没有选择任何行。
SELECT *
FROM compatibility c
WHERE rating_id > 1
AND NOT EXISTs
(SELECT *
FROM compatibility c2
WHERE c.rating_id > 1
AND (
(c.attr1_id = c2.attr1_id) AND (c.attr2_id = c2.attr2_id)
OR
(c.attr1_id = c2.attr2_id) AND (c.attr2_id = c2.attr1_id)
)
)
我该如何实现这个目标?
first_value
。 - a_horse_with_no_name