MySQL 选择计数与 EXISTS

Posted

技术标签:

【中文标题】MySQL 选择计数与 EXISTS【英文标题】:MySQL Select Count with EXISTS 【发布时间】:2011-05-24 00:33:24 【问题描述】:

我有 3 张桌子。

table1 id,thing_id

table_index 身份证

table_index_info table_index_id,table1_id

table_index_info 包含 table_index 的历史记录。这个历史可以引用table1,可能很多次,也可能是0次。

我需要运行一个查询来返回 table1 中具有特定 thing_id 的所有行。 它还需要计算 table_index 中有多少行至少有 1 个 table_index_info 链接到 table1。

这是我的查询:

SELECT table1.*,
   (SELECT COUNT(i.id)
      FROM table_index i
      WHERE EXISTS (SELECT 0
                 FROM table_index_info h
                 WHERE h.table1_id = table1.id
                 AND h.table_index_id = i.id)
   ) AS indexCount

FROM table1
WHERE table1.thing_id= $thingId 

这是最好/正确的方法吗?

【问题讨论】:

【参考方案1】:

在这种情况下,我会使用 JOIN 而不是 EXISTS。

SELECT table1.*,
    ( SELECT COUNT(i.id)
         FROM table_index i
         INNER JOIN table_index_info h ON h.table_index_id = i.id 
         WHERE h.table1_id = table1.id
     ) AS indexCount
FROM table1
WHERE table1.thing_id = $thingId 

【讨论】:

如果 table_index_info 上有很多很多结果,JOIN 会不会更慢? 我刚刚运行了一些测试,它们都可以工作,但是当 table_index_info 中有很多行时,EXISTS 查询需要永远并且 JOIN 查询很快。你能为我解释一下吗?

以上是关于MySQL 选择计数与 EXISTS的主要内容,如果未能解决你的问题,请参考以下文章

Oracle SQL - 将选择计数(*)转换为零或一

具有子句mysql的嵌套计数?

MySQL 自动递增和选择计数

MySQL选择不同的计数

Mysql如何以10分钟间隔选择计数聚合结果

MySQL按值选择计数