mysql在单个表中使用不同的where子句进行多次计数

时间:2013-01-29 13:00:30

标签: mysql

我有三个执行COUNT的SELECT语句。认为将mysql结合起来会更有效率和更友善:

$query = $db->query("SELECT count(category) FROM table WHERE cid='290463' and category = 'x'"); 
         $tot_x = $db->result($query, 0);

$query = $db->query("SELECT count(category) FROM table WHERE cid='290463' and category = 'y'"); 
         $tot_y = $db->result($query, 0);

$query = $db->query("SELECT count(category) FROM table WHERE cid='290463' and category = 'z'"); 
         $tot_z = $db->result($query, 0);

一句话:

SELECT 
    SUM(category='x' AND cid='290463') as tot_x, 
    SUM(category='y' AND cid='290463') as tot_y, 
    SUM(category='z' AND cid='290463') as tot_z 
FROM table

问题是,新语句比分别运行原始语句慢。

任何人都能够了解为什么新声明会更慢以及建议如何更快地改进SELECT?

2 个答案:

答案 0 :(得分:3)

您的原始查询可能能够使用您的表上的索引(基于您的where子句),确保只读取表中相对较小比例的记录 - 而不是整个表,就像在您的表中一样统一查询。尝试将等效条件添加回where子句,如下所示:

SELECT 
    SUM(category='x') as tot_x, 
    SUM(category='y') as tot_y, 
    SUM(category='z') as tot_z 
FROM table
WHERE cid='290463' and category in ('x', 'y', 'z')

答案 1 :(得分:0)

SELECT 
    SUM(IF(category='x',1,0))as tot_x, 
    SUM(IF(category='y',1,0))as tot_y, 
    SUM(IF(category='z',1,0))as tot_z
FROM table
WHERE cid='290463'
GROUP BY category