如何从另一个表(加入)

时间:2017-10-18 15:12:55

标签: mysql join count

我在坟场有一个100,000个名字的数据库。公墓数量约为6000 ....我希望返回每个墓地的名字数量。

如果我进行单独查询,则需要一毫秒

SELECT COUNT(*) FROM tblnames
    WHERE tblcemetery_ID = 2 

我的实际查询一直在继续,我最终杀了它,所以我不会杀死我们的数据库。有人能用更有效的方法指出我吗?

select tblcemetery.id,
  (SELECT COUNT(*) FROM tblnames
        WHERE tblcemetery_ID = tblcemetery.id) AS casualtyCount
    from tblcemetery                                                      
      ORDER BY
   fldcemetery

3 个答案:

答案 0 :(得分:2)

您可以将查询重新定义为使用连接而不是相关子查询:

SELECT
    t1.id,
    COUNT(t2.tblcemetery_ID) AS casualtyCount
FROM tblcemetery t1
LEFT JOIN tblnames t2
    ON t1.id = t2.tblcemetery_ID
GROUP BY
    t1.id
ORDER BY
    t1.id

我听说在某些数据库中,例如Oracle,优化器足够聪明,可以弄清楚我上面写的内容,并会在底层重构您的查询。但MySQL优化器可能不够聪明,无法做到这一点。

这个重构的一个不错的副作用是我们现在看到通过向连接列添加索引来提高性能的机会。我假设idtblcemetery的主键,在这种情况下它已经被编入索引。但您可以在tblcemetery_ID表中向tblnames添加索引,以提高性能:

CREATE INDEX cmtry_idx ON tblnames (tblcemetery_ID)

答案 1 :(得分:0)

或者您可以查找group by here f.e.并执行类似

的操作
   SELECT tblcemetery_ID,  sum(1) from tblnames group by tblscemetery_id

对于属于这个墓地的每个名称条目,你基本上总结了1,因为你根本没有在名称中加入,不需要加入公墓细节表

不确定sum(1)count(*)是否更好,两者都应该有效。

你只能获得内部有ppl的墓地

答案 2 :(得分:0)

通过使用像这样的JOIN子句,甚至可以在没有EXISTS的情况下完成

SELECT id, COUNT(*) AS casualtyCount
FROM tblcemetery
WHERE EXISTS (SELECT 1 FROM tblnames WHERE tblcemetery_ID=id)
GROUP BY id
ORDER BY id