是否有可能“结束”。两个不同的COUNT(列)WHERE列可以有两个不同的值和不同的总数?

时间:2014-05-23 10:06:42

标签: mysql sql count

我在一个复杂的查询中遇到了这个问题。让我更清楚一个例子。

如果我有一个横幅表存储网站上的所有横幅,我有另一个名为banner_statistics的表,它在特定时间段内存储每个横幅事件的记录(事件可以是'我',这意味着横幅和'C'的印象,这意味着点击横幅)。

如果我运行此查询:

-- Count number of impressions of the banner with id = 1
SELECT 
    ban_id,
    ban_url,
    COUNT(bansta_event) as num_impressions
FROM banner
    LEFT JOIN banner_statistics
        ON bansta_ban_id = ban_id
        AND bansta_event = 'I' 
WHERE ban_id = 1

我明白了:

ban_id    ban_url                    num_impressions
1         http://www.cocacola.com    7

它说id = 1的横幅广告是一个cocacola横幅共有7次展示。

如果我使用'C'运行相同的查询(点击该横幅上的事件):

-- Count number of impressions of the banner with id = 1
SELECT 
    ban_id,
    ban_url,
    COUNT(bansta_event) as num_impressions
FROM banner
    LEFT JOIN banner_statistics
        ON bansta_ban_id = ban_id
        AND bansta_event = 'C' 
WHERE ban_id = 1

我明白了:

ban_id    ban_url                    num_clicks
 1        http://www.cocacola.com    1

它说这个横幅只有一次点击

现在我如何将这些结果合并到一个查询中以获得此结果:

ban_id    ban_url                    num_impressions     num_clicks
1         http://www.cocacola.com    7                   1

有办法吗?它似乎是一个CONCAT,但它不是因为它是同一列上有COUNT的另一个查询的结果,但是该列上的计数条件是不同的......

我如何在MySQL中实现这一目标?我发现有GROUP_CONCAT,但它不能接收SELECT查询的结果作为param,我不认为它可以在我的情况下工作...

1 个答案:

答案 0 :(得分:4)

试试这个:

SELECT 
    ban_id,
    ban_url,
    IFNULL(SUM(bansta_event = 'C'), 0) as num_impressions,
    IFNULL(SUM(bansta_event = 'I'), 0) as num_clicks
FROM banner
LEFT JOIN banner_statistics
    ON bansta_ban_id = ban_id
        AND bansta_event IN ('I', 'C') 
WHERE ban_id = 1

在MySQL中,比较运算符在匹配时返回10当它们不匹配时。因此,对它们求和会得到符合该条件的行数。如果没有符合条件的行,则需要IFNULL,因此我们会在结果中获得0而不是NULL