【问题标题】:How can I select the count of rows as a subquery of results from main query如何选择行数作为主查询结果的子查询
【发布时间】:2013-04-07 17:02:27
【问题描述】:

仅当WHERE places.x < 5 为真时,我才尝试在某个地方收集物品的数量。原因是at_placesplaces 表都包含数万行。

这是我正在尝试做的一般想法;但我无法测试它,因为它需要很长时间才能完成。我认为能够在一个查询中同时包含计数的抓取和位置会比运行后续查询来抓取返回的每个位置的计数要快得多。

SELECT  `places`.`id`, 
        `places`.`name`,
        (SELECT COUNT(*) FROM `at_places` WHERE places_id=places.id) AS count
FROM `places`
WHERE places.x < 5

【问题讨论】:

  • 这个查询不应该花那么长时间。 at_places.idplaces.idplaces.x 字段是否有索引?
  • 仅在 ID 上。我还有很多东西要进行比较以减少地点列表,为了清楚起见,我只是使用 x 作为占位符。
  • 如果您在 WHERE 子句中使用的字段编制索引,它仍然可能有助于加快查询速度。使用EXPLAIN SELECT ... 查看正在使用的索引。
  • 我考虑过。我的主要问题是 at_places 至少每天更改一次,有时更频繁。我认为插入的放缓会超过好处?但也许不是,我想我可以试试。

标签: mysql count subquery


【解决方案1】:

您可能会发现显式连接效果更好:

select p.id, p.name, ap.cnt
from places p join
     (select ap.places_id, count(*) as cnt from at_places ap group by ap.places_id) ap
     on p.id = ap.places_id
where p.x < 5

我相信您的性能问题是由于子查询对外部查询中的每一行执行一次。 at_places.places_id 上的索引也应该加快查询速度。

【讨论】:

  • 不,我正在查找 at_places 表中与作为计数列附加到结果中的位置行具有相同 ID 的行数。 (听起来很粗糙,我会画)====查询结果==== id |姓名 |计数
  • 谢谢 Gordon,我试图编辑您的答案,但被拒绝了。唯一需要不同的是 ap.cnt 应该添加到顶部的 select 子句中 - 否则它只会在行上列出 id 和 name。但效果很好。干杯。
猜你喜欢
  • 1970-01-01
  • 2014-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-29
相关资源
最近更新 更多