Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在同一个表上使用4个内部联接加快sql查询?_Sql_Postgresql - Fatal编程技术网

在同一个表上使用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;

我有这张桌子。然后有一个引用多个表的查询。