简体   繁体   English

如何有效地分组,总结和排序这个MySQL结果?

[英]How to efficiently group, sum and sort this mysql result?

I'm pulling a grouping of comment types and their totals from a mySQL database. 我正在从mySQL数据库中提取一组注释类型及其总数。 The result set looks like: 结果集如下所示:

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

In my output to the end user, however, I want to sum the totals for GENERAL and MISC, IDs 0 and 4. How should I efficiently do this? 但是,在我输出给最终用户时,我想总结GENERAL和MISC的总数,ID 0和4.我应该如何有效地执行此操作? The problem I'm seeing is that ID 0 might not be in every result and the same thing for ID 4. 我看到的问题是ID 0可能不在每个结果中,而ID 4也是如此。

Any suggestions? 有什么建议么?

My query is: 我的查询是:

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

So my end-user result should look like: 所以我的最终用户结果应如下所示:

GENERAL/MISC - 9 GENERAL / MISC - 9
MEANINGFUL - 9 意思是 - 9

Try this query - 试试这个查询 -

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

You may write your custom new_name field. 您可以编写自定义的new_name字段。

I would make it easy on you and MySQL and split it out like this: 我会让你和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)

I changed your LEFT JOIN to JOIN because we're only counting comments with a type. 我将LEFT JOIN更改为JOIN因为我们只计算带有类型的注释。

You might improve this query, assuming an index on fk_type_id , by making 'MISC' type '1' instead of type '4', so you could do something like a.fk_type_id < 2 instead of ( a.fk_type_id = 0 OR a.fk_type_id = 4 ) and a.fk_type_id > 1 instead of a.fk_type_id <> 0 AND a.fk_type_id <> 4 . 假设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

If you're utilizing indexes instead of scanning rows, performing two separate queries that return different results won't affect performance. 如果您正在使用索引而不是扫描行,则执行两个返回不同结果的单独查询不会影响性能。

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

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM