2011-05-02 66 views
2

这里是我的查询:联盟选择列不匹配

SELECT 
    FROM_UNIXTIME(date_added, '%m-%d-%Y') AS formatted_date, 
    SUM(tb =1) AS sum_users, 
    SUM(tb =2) AS sum_links, 
    SUM(tb =3) AS sum_ads, 
    SUM(tb =4) AS sum_actions 
FROM (
    SELECT date_added, 1 AS tb 
     FROM users_list WHERE 1=1 
    UNION ALL 
    SELECT date_added, 2 
     FROM users_links WHERE 1=1 
    UNION ALL 
    SELECT date_served, 3 
     FROM ads_served WHERE 1=1 
    UNION ALL 
    SELECT date_served, 4 
     FROM actions WHERE 1=1 
) AS t 
GROUP BY formatted_date 
ORDER BY formatted_date DESC 

这里是我的表中的数据:

users_list

id date_added 
1  1234567890 
2  1334567890 
3  1434567890 

users_links

id date_added 
1  1244567890 
2  1354567890 
3  1464567890 

ads_served

id date_served revenue 
1  1234567891  0.01 
2  1334567892  0.02 
3  1434567893  0.02 

行动

id date_served 
1  1234561890 
2  1334562890 
3  1434563890 

我想总结的收入FORMATTED_DATE在ads_served表作为输出查询第6列。我失去了从哪里开始。如果我将总和(收入)添加到工会选择我得到一个“列不匹配”错误。

回答

1

试试这种方法。你为什么用1 = 1?

SELECT 
    FROM_UNIXTIME(date_added, '%m-%d-%Y') AS formatted_date, 
    SUM(tb =1) AS sum_users, 
    SUM(tb =2) AS sum_links, 
    SUM(tb =3) AS sum_ads, 
    SUM(tb =4) AS sum_actions, 
    sum(total) as tot_rev 
FROM (
    SELECT date_added,'' as total, 1 AS tb 
     FROM users_list WHERE 1=1 
    UNION ALL 
    SELECT date_added,'', 2 
     FROM users_links WHERE 1=1 
    UNION ALL 
    SELECT date_served,revenue, 3 
     FROM ads_served WHERE 1=1 
    UNION ALL 
    SELECT date_served,'', 4 
     FROM actions WHERE 1=1 
) AS t 
GROUP BY formatted_date 
ORDER BY formatted_date DESC 
+0

doh!应该想到这一点。这工作! – reefine 2011-05-03 00:08:49

+0

“as total”后面应该有一个逗号btw – reefine 2011-05-03 00:09:14

+0

为了这个例子,我忘了编辑WHERE 1 = 1。在代码中,应用于每个SELECT语句的过滤器。我使用“1 = 1”来确保下面的过滤器在前面有“和”以便更容易地应用过滤器。 – reefine 2011-05-03 00:10:45

3

revenue属于ads_served,但你从一个子查询中选择其中revenue不存在。将它添加到子查询中:

SELECT 
    FROM_UNIXTIME(date_added, '%m-%d-%Y') AS formatted_date, 
    SUM(tb =1) AS sum_users, 
    SUM(tb =2) AS sum_links, 
    SUM(tb =3) AS sum_ads, 
    SUM(tb =4) AS sum_actions, 
    SUM(revenue) As sum_revenue 
FROM (
    SELECT date_added, 1 AS tb, 0 As revenue 
     FROM users_list WHERE 1=1 
    UNION ALL 
    SELECT date_added, 2, 0 
     FROM users_links WHERE 1=1 
    UNION ALL 
    SELECT date_served, 3, revenue 
     FROM ads_served WHERE 1=1 
    UNION ALL 
    SELECT date_served, 4, 0 
     FROM actions WHERE 1=1 
) AS t 
GROUP BY formatted_date 
ORDER BY formatted_date DESC 
+0

感谢您的回答。你伤心地迟到了2分钟。 upvoted为您提供帮助。 – reefine 2011-05-03 00:12:59

+0

Upvoted也是因为你的查询更加正确。 – 2011-05-03 00:22:37