可以“分组”而不会丢失原始行?

时间:2012-09-21 09:11:25

标签: mysql sql

我有这样的查询:

ID    |    name                     |    commentsCount
1     |    mysql for dummies        |    33
2     |    mysql beginners guide    |    22

SELECT
    ...,
    commentsCount    // will return 33 for first row, 22 for second one
FROM
    mycontents
WHERE
    name LIKE "%mysql%"

我也想知道所有行的评论总数:

SELECT
    ...,
    SUM(commentsCount) AS commentsCountAggregate    // should return 55
FROM
    mycontents
WHERE
    name LIKE "%mysql%"

但是这个显然会返回一行总数。

现在我想将这两个查询合并为一个,

因为我的实际查询执行非常繁重(它使用布尔全文搜索,子串偏移搜索,而且遗憾的是更多),然后我不想执行它两次

有没有办法在不进行SELECT两次的情况下获得注释总数?

!!欢迎定制功能!!

也欢迎使用变量,我从未使用过它们......

3 个答案:

答案 0 :(得分:2)

您可以将中间结果缓存到临时表,然后对此表进行总结

答案 1 :(得分:1)

一个明显的解决方案是使用另一个“临时”表存储中间结果,然后在第二步中执行聚合。

另一个解决方案是准备一个包含所需总和的查找表(但显然需要一些分组ID,我称之为MASTER_ID),如下所示:

CREATE TABLE comm_lkp AS
SELECT MASTER_ID, SUM(commentsCount) as cnt
FROM mycontents
GROUP BY MASTER_ID

还在列MASTER_ID上的该表上创建索引。稍后,您可以像这样修改您的查询:

SELECT
    ...,
    commentsCount,
    cnt as commentsSum
FROM
    mycontents as a
        JOIN comm_lkp as b ON (a.MASTER_ID=b.MASTER_ID)
WHERE
    name LIKE "%mysql%"

只要查找表格相对较小,它也不应该触及你的表现。

答案 2 :(得分:0)

其中一个ID字段上的GROUP BY可能会起作用。然后,这将为您提供每个ID的SUM(commentsCount)。

您问题中的查询不够详细,无法知道ID字段应该来自哪个字段/表格。