2012-02-28 115 views
1

我从mySQL数据库中提取了一组评论类型及其总数。结果集看起来像:如何高效地对这个mysql结果进行分组,总结和排序?

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

以我输出到端但是,我想总结GENERAL和MISC,ID 0和4的总数。我应该如何有效地执行此操作?我看到的问题是,ID 0可能不是每个结果和ID 4相同的东西。

有什么建议吗?

我的查询是:

​​

所以我的最终用户的结果应该是这样的:

GENERAL/MISC - 9
有意义 - 9

+0

产生这个问题的查询是什么? – 2012-02-28 14:56:09

+0

如果在结果行中不是exixst,那么TOTAL是0.或者你想要其他的吗? – Narek 2012-02-28 15:00:51

回答

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 JOINJOIN因为我们只计算一个类型的意见。

你可能会改善查询,在fk_type_id假设一个索引,通过使“MISC”型“1”,而不是类型“4”,所以你可以不喜欢a.fk_type_id < 2代替(a.fk_type_id = 0 OR a.fk_type_id = 4)和a.fk_type_id > 1,而不是a.fk_type_id <> 0 AND a.fk_type_id <> 4

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

0

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

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

但我还需要返回其他潜在ID。因此,在上面的示例中,我的最终用户可能会看到GENERAL/MISC - 9,MEANINGFUL - 9 – Mike 2012-02-28 15:00:08

+1

@Mike,那么为什么不执行原始查询并自己添加General和Misc总计? – Brian 2012-02-28 15:10:25

2

尝试此查询 -

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

您可以编写自定义new_name场。

相关问题