sql - 在应用 LIMIT 子句之前,UNIQUE 键上的 GROUP BY 是否会计算所有组?

标签 sql mysql grouping limit

如果我在唯一键上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/

相关文章:

php - #1241 - 操作数应包含 1 列 : why?

php - 信息未提交到数据库

php - 如何将 HTML 表单中的值添加到数据库中的值

xml - 每个节点的最大不同子元素数

XSLT 3 级属性分组

mysql - Limit With order by 在mysql中只需要10条记录需要很长时间

sql - 减少 CTE 表中的记录数

sql - 如果值等于最后一行,Postgresql 跳过行

mysql - SQL:将具有相同标题的所有表复制到一个表中

c# - 如何从 SQL 进行过滤和分组 ListView