【问题标题】:Union Select Column Mismatch联合选择列不匹配
【发布时间】:2011-08-17 08:19:21
【问题描述】:

这是我的查询:

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

这是我的表格数据:

用户列表

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

我正在尝试将 ads_served 表中 formatted_date 的收入相加,作为输出查询的第 6 列。我不知道从哪里开始。如果我将 sum(revenue) 添加到 union select 我会收到“列不匹配”错误。

【问题讨论】:

    标签: mysql select union


    【解决方案1】:

    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
    

    【讨论】:

    • 感谢您的回答。可悲的是,你迟到了 2 分钟。为您的帮助点赞。
    【解决方案2】:

    以这种方式尝试。你为什么使用 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
    

    【讨论】:

    • 顺便说一句,“as total”后面应该有一个逗号
    • 为了这个例子,我忘了编辑 WHERE 1=1。在代码中,每个 SELECT 语句都应用了过滤器。我使用“1=1”来确保以下过滤器前面有“和”,以便更轻松地应用过滤器。
    • 好的,我猜你正在创建动态查询。
    • 啊,好的。当我发布我的信息时,我已经把它作为儿子修复了。我怕我忘记了别的东西。 :)
    • @user396449:manji 做了同样的事情,但他使用 0 而不是空字符串的解决方案更正确。 :) 将其应用于您的最终查询。
    猜你喜欢
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多