0

你好我有一个这样的sql查询:

SELECT 
    COUNT(*) AS total, 
    COUNT(referrer) AS referrer,  
    DATE_FORMAT(created_at, "%Y") AS YEAR, 
    DATE_FORMAT(created_at, "%m") AS MONTH, 
    DATE_FORMAT(created_at, "%d") AS DAY
FROM 
    users
GROUP BY 
    EXTRACT(DAY FROM created_at), 
    EXTRACT(MONTH FROM created_at), 
    EXTRACT(YEAR FROM created_at)
ORDER BY 
    created_at ASC

这给了我按天(月和年)排序的总计表。我需要的是添加一个子查询来显示一个具有条件的 count()。就像是:

(SELECT count(*) FROM users WHERE result = '1') as winners

问题显然在于主查询的分组,因为我得到相同的结果而没有对每一行的子查询进行分组。

执行此类查询的正确方法是什么?

4

2 回答 2

1

怎么样

SELECT 
    COUNT(*) AS total, 
    COUNT(referrer) AS referrer,  
    SUM(case when result = '1' then 1 else 0 end) as winners
    DATE_FORMAT(created_at, "%Y") AS YEAR, 
    DATE_FORMAT(created_at, "%m") AS MONTH, 
    DATE_FORMAT(created_at, "%d") AS DAY
FROM 
    users
GROUP BY 
    EXTRACT(DAY FROM created_at), 
    EXTRACT(MONTH FROM created_at), 
    EXTRACT(YEAR FROM created_at)
ORDER BY 
    created_at ASC;

假设created_at是一个时间戳,我们可以重写您的查询,只使用一个字段进行分组,如下所示:

SELECT 
    COUNT(*) AS total, 
    COUNT(referrer) AS referrer,  
    SUM(case when result = '1' then 1 else 0 end) as winners
    DATE_FORMAT(created_at, "%Y") AS YEAR, 
    DATE_FORMAT(created_at, "%m") AS MONTH, 
    DATE_FORMAT(created_at, "%d") AS DAY
FROM 
    users
GROUP BY date(created_at)
ORDER BY 
    created_at ASC;

请注意我没有mysql手。

于 2013-09-27T08:26:03.810 回答
1

您可以将这两个查询与UNION

SELECT 
    COUNT(*) AS total, 
    COUNT(referrer) AS referrer,  
    DATE_FORMAT(created_at, "%Y") AS YEAR, 
    DATE_FORMAT(created_at, "%m") AS MONTH, 
    DATE_FORMAT(created_at, "%d") AS DAY
FROM 
    users
GROUP BY 
    EXTRACT(DAY FROM created_at), 
    EXTRACT(MONTH FROM created_at), 
    EXTRACT(YEAR FROM created_at)
ORDER BY 
    created_at ASC
UNION
SELECT count(*) FROM users 
GROUP BY 
    EXTRACT(DAY FROM created_at), 
    EXTRACT(MONTH FROM created_at), 
    EXTRACT(YEAR FROM created_at)
HAVING result = '1'
于 2013-09-27T08:26:17.370 回答