这种情况可能是由于子查询中的 GROUP BY
语句导致了优化器无法有效地执行查询。
在子查询中,你按照 user_id
和 item_id
对表进行了分组,并且只选择了满足条件的组。然而,在主查询中,你并没有对结果进行分组,并且选择了所有的列。这可能导致优化器无法有效地执行查询,因为它需要为每个 item_id
和 user_id
的组合生成一个结果。
为了解决这个问题,你可以尝试对主查询中的结果进行分组。这样可以消除子查询中分组的影响,使查询更加高效。例如:
SELECT id, user_id, item_id
FROM (
SELECT item_id, user_id, COUNT(*) AS count
FROM questionnaire_answer_old_0
GROUP BY item_id, user_id
HAVING COUNT(user_id) > 1 AND COUNT(item_id) > 1
) AS subquery
JOIN questionnaire_answer_old_0 ON item_id = item_id AND user_id = user_id;
上述代码将首先对 questionnaire_answer_old_0
表进行分组,并计算每个 item_id
和 user_id
组合的出现次数。然后,它使用 JOIN
将子查询的结果与原始表连接起来,以获取所需的列。
请注意,上述查询只是一个示例,并且可能需要根据实际情况进行调整。另外,如果表中的数据量非常大,那么这种查询可能会对性能产生一定的影响。在这种情况下,可能需要考虑其他优化措施,例如建立适当的索引或对数据进行预处理。
子查询中GROUP BY语句对整个表进行分组和聚合操作,可能会导致查询时间较长,建议换个执行工具或者等他执行完看下执行时间。
或者优化下sql:
SELECT id, user_id, item_id
FROM questionnaire_answer_old_0
WHERE item_id IN (
SELECT DISTINCT item_id -- 直接distinct筛选
FROM questionnaire_answer_old_0
WHERE user_id IN (
SELECT user_id
FROM questionnaire_answer_old_0
GROUP BY user_id, item_id
HAVING COUNT(user_id) > 1 AND COUNT(item_id) > 1
)
);