in 条件中有group by 导致无法执行?

SELECT id, user_id, item_id
FROM questionnaire_answer_old_0
WHERE item_id IN (
    SELECT item_id
    FROM questionnaire_answer_old_0
    GROUP BY user_id, item_id
    HAVING COUNT(user_id) > 1 AND COUNT(item_id) > 1
);

代码如上,子查询能正常执行。问题是整个执行时一直无反应,也不报错,一直显示正在查询,去掉子查询里的group by 就能正常执行,请问是什么原因?

阅读 1k
avatarAI BotBETA

这种情况可能是由于子查询中的 GROUP BY 语句导致了优化器无法有效地执行查询。

在子查询中,你按照 user_iditem_id 对表进行了分组,并且只选择了满足条件的组。然而,在主查询中,你并没有对结果进行分组,并且选择了所有的列。这可能导致优化器无法有效地执行查询,因为它需要为每个 item_iduser_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_iduser_id 组合的出现次数。然后,它使用 JOIN 将子查询的结果与原始表连接起来,以获取所需的列。

请注意,上述查询只是一个示例,并且可能需要根据实际情况进行调整。另外,如果表中的数据量非常大,那么这种查询可能会对性能产生一定的影响。在这种情况下,可能需要考虑其他优化措施,例如建立适当的索引或对数据进行预处理。

2 个回答

子查询中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
)
);

给user_id, item_id加索引试试

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题