如果我在唯一键上GROUP BY
,并将LIMIT
子句应用于查询,是否会在应用限制之前计算所有组?
如果我在表中有一百条记录(每条记录都有一个唯一键),那么我之前创建的临时表中是否会有 100
条记录(用于 GROUP BY
)应用了 LIMIT
?
为什么我需要这个的案例研究:
以Stack Overflow
为例。
您运行的每个查询都会显示问题列表,还会显示提出此问题的用户以及他拥有的徽章数量。
因此,虽然用户<->问题是一对一的,但用户<->徽章是一对一的。
在一个查询中执行此操作的唯一方法(而不是一个关于问题的查询和另一个关于用户的查询,然后合并结果)是按主键 (question_id) 和 join+group_concat 将查询分组到 user_badges 表。
问题TAGS也是如此。
Code example:
Table Questions:
question_id (int)(pk)| question_body(varchar)
Table tag-question:
question-id (int) | tag_id (int)
SELECT:
SELECT quesuestions.question_id,
questions.question_body,
GROUP-CONCAT(tag_id,' ') AS 'tags-ids'
FROM
questions
JOIN
tag_question
ON
questions.question_id=tag-question.question-id
GROUP BY
questions.question-id
LIMIT 15
最佳答案
是的,查询执行的顺序是:
- 来自
- 哪里
- 组
- 拥有
- 排序
- 选择
- 限制
LIMIT 是最后计算的东西,因此您的分组会很好。
现在,看看你改写的问题,那么你不是每组只有一行,而是很多:在 stackoverflow 的情况下,你每行只有一个用户,但有很多徽章 - 即
(uid, badge_id, etc.)
(1, 2, ...)
(1, 3, ...)
(1, 12, ...)
所有这些都将组合在一起。
为了避免全表扫描,你所需要的只是索引。除此之外,如果您需要 SUM,例如,您无法避免全扫描。
编辑:
你需要这样的东西(看看 WHERE 子句):
SELECT
quesuestions.question_id,
questions.question_body,
GROUP_CONCAT(tag_id,' ') AS 'tags_ids'
FROM
questions q1
JOIN tag_question tq
ON q1.question_id = tq.question-id
WHERE
q1.question_id IN (
SELECT
tq2.question_id
FROM
tag_question tq2
ON q2.question_id = tq2.question_id
JOIN tag t
tq2.tag_id = t.tag_id
WHERE
t.name = 'the-misterious-tag'
)
GROUP BY
q1.question_id
LIMIT 15
关于sql - 在应用 LIMIT 子句之前,UNIQUE 键上的 GROUP BY 是否会计算所有组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/747639/