3

我有一个这样的查询:

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 的情况下获得评论总数?

!!欢迎自定义功能!

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

4

3 回答 3

2

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

于 2012-09-21T09:15:45.777 回答
1

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

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

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

还要在该表的 column 上创建一个索引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%"

只要查找表相对较小,它也不应该影响您的性能。

于 2012-09-21T09:36:18.603 回答
0

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

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

于 2012-09-21T09:20:26.667 回答