如何有效地对这个mysql结果进行分组,求和和排序?

时间:2012-02-28 14:54:45

标签: php mysql

我从mySQL数据库中提取了一组注释类型及其总数。结果集如下所示:

  

ID - NAME - TOTAL
  0 - 一般 - 4
  3 - 有意义 - 9
  4 - MISC - 5

然而,在我输出给最终用户时,我想总结GENERAL和MISC的总数,ID 0和4.我应该如何有效地做到这一点?我看到的问题是ID 0可能不在每个结果中,而ID 4也是如此。

有什么建议吗?

我的查询是:

SELECT a.fk_type_id as ID, count(a.fk_type_id) as TOTAL, b.vch_name as NAME
FROM comments a
LEFT JOIN comments_types b ON a.fk_type_id = b.id
WHERE a.entry = X
GROUP BY a.fk_type_id

所以我的最终用户结果应如下所示:

  

GENERAL / MISC - 9
  意思是 - 9

3 个答案:

答案 0 :(得分:2)

尝试此查询 -

SELECT
  IF(name = 'GENERAL' OR name = 'MISC', 'GENERAL/MISC', name) new_name
  , SUM(total)
FROM
  comments
GROUP BY
  new_name

您可以编写自定义new_name字段。

答案 1 :(得分:1)

我会让你和MySQL轻松一点,并将其拆分出来:

(SELECT a.fk_type_id as ID, COUNT(a.fk_type_id) as TOTAL, b.vch_name as NAME
FROM comments a
JOIN comments_types b ON a.fk_type_id = b.id
WHERE a.entry = X AND a.fk_type_id <> 0 AND a.fk_type_id <> 4
GROUP BY a.fk_type_id)
UNION ALL
(SELECT a.fk_type_id as ID, COUNT(a.fk_type_id) as TOTAL, 'GENERAL/MISC' as NAME
FROM comments a
JOIN comments_types b ON a.fk_type_id = b.id
WHERE a.entry = X AND (a.fk_type_id = 0 OR a.fk_type_id = 4)
GROUP BY a.fk_type_id)

我将您的LEFT JOIN更改为JOIN,因为我们只计算带有类型的评论。

假设fk_type_id上有索引,您可以改进此查询,方法是将'MISC'类型设置为'1'而不是类型'4',这样您就可以执行类似a.fk_type_id < 2而不是a.fk_type_id = 0 OR a.fk_type_id = 4的操作{1}})和a.fk_type_id > 1代替a.fk_type_id <> 0 AND a.fk_type_id <> 4

如果您正在使用索引而不是扫描行,则执行两个返回不同结果的单独查询不会影响性能。

答案 2 :(得分:0)

这将汇总GENERAL和MISC的多个条目

SELECT SUM(TOTAL) FROM tablename WHERE NAME='GENERAL' OR NAME='MISC';