2011-05-02 71 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