在同一个表上使用4个内部联接加快sql查询?
我有这张桌子:在同一个表上使用4个内部联接加快sql查询?,sql,postgresql,Sql,Postgresql,我有这张桌子: name: string value: string user_id: ID 基本上,我试图找到共享两个或更多相同键值对的所有匹配用户集 例如,如果有这些行 name,value,user_id "test", "value1", "user_1" "test", "value3", "user_2" "test2", "valu
name: string
value: string
user_id: ID
基本上,我试图找到共享两个或更多相同键值对的所有匹配用户集
例如,如果有这些行
name,value,user_id
"test", "value1", "user_1"
"test", "value3", "user_2"
"test2", "value2", "user_1"
"test3", "value3", "user_1"
"test2", "value2", "user_2"
"test3", "value3", "user_2"
我希望输出为:
kv_name_1, kv_value_1, kv_name_2, kv_value_2, count
"test2", "value2", "test3", "value3", 2
因为用户_1和用户_2都有两个相同的键值对。如果有第三个或第四个用户具有相同的值,那么将是计数4等
我有这样一个疑问,它是有效的,但上帝它是缓慢的。查询计划本身可能需要100毫秒
SELECT
q1.e1Name,
q1.e1Value,
q1.e3Name,
q1.e3Value,
count(*)
FROM ( SELECT DISTINCT ON (e1.id, e3.id)
e1.name AS e1Name,
e1.value AS e1Value,
e1.id,
e3.name AS e3Name,
e3.value AS e3Value,
e3.id
FROM
user_properties e1
JOIN users eu ON e1.user_id = eu.id
JOIN user_groups p ON p.group_id = 'x'
AND p.user_id = eu.id
JOIN user_properties e2 ON e1.name = e2.name
AND e1.value = e2.value
AND e1.id != e2.id
JOIN users eu2 ON e2.user_id = eu2.id
JOIN user_groups p2 ON p2.group_id = 'x'
AND p2.user_id = eu2.id
JOIN user_properties e3 ON e3.user_id = eu.id
AND e1.name != e3.name
JOIN user_properties e4 ON e4.id != e2.id
AND e4.name = e3.name
AND e3. "value" = e4.value
AND e4.user_id = e2.user_id) q1
GROUP BY
q1.e1Name,
q1.e1Value,
q1.e3Name,
q1.e3Value;
现在我可能意识到我需要找到一种方法来部分分组/限制每个子查询返回的结果的数量,但不确定在何处执行此操作从生成两个键/值对的所有候选对开始。然后连接到数据以确定它们出现的次数:
with candidates as (
select kv.key as key1, kv.value as value1, kv2.key as key2, kv.value as value2, kv.user_id
from keyvalue kv join
keyvalue kv2
on kv.user_id = kv2.user_id and
(kv.key, kv.value) < (kv2.key, kv2.value)
)
select key1, value1, key2, value2, count(*)
from candidates c1 join
candidates c2
using (key1, value1, key2, value2)
where c1.user_id < c2.user_id
group by key1, value1, key2, value2;
我有这张桌子。然后有一个引用多个表的查询。