Mysql在末尾添加一个额外的列,而不是使用union

Mysql在末尾添加一个额外的列,而不是使用union,mysql,Mysql,我正在尝试合并两个查询,以便数据显示在一个表中。我使用一个联合来组合这两个查询。但是,所有内容都添加到同一列中,我要更改什么,以便不同查询的结果占用一个新列。 下面是查询结果的图像 这是我的密码 select * from( SELECT CASE WHEN age BETWEEN 18 and 25 THEN 'Under 25' WHEN age BETWEEN 25 and 40 THEN '25 - 40' WHEN age >= 40 THEN 'Ove

我正在尝试合并两个查询,以便数据显示在一个表中。我使用一个联合来组合这两个查询。但是,所有内容都添加到同一列中,我要更改什么,以便不同查询的结果占用一个新列。 下面是查询结果的图像

这是我的密码

select * from(

SELECT
CASE
    WHEN age BETWEEN 18 and 25 THEN 'Under 25'
    WHEN age BETWEEN 25 and 40 THEN '25 - 40'
    WHEN age >= 40 THEN 'Over 40'
    WHEN age IS NULL THEN 'Not Filled In (NULL)'
END as age_range,
COUNT(*) AS count,
 CASE
    WHEN age between 18 and 25 THEN 1
    WHEN age BETWEEN 25 and 40 THEN 2
    WHEN age >= 40 THEN 8
    WHEN age IS NULL THEN 9
END as ordinal

FROM (SELECT TIMESTAMPDIFF(YEAR, users.birthdate_on, CURDATE()) AS age FROM users
join subscriptions on users.id = subscriptions.user_id
where users.plan <> 'domain' and users.plan <> '' and users.plan <> 'domain_cpi' and users.birthdate_on is not null 
) as derived

GROUP BY age_range


union 

SELECT
CASE
    WHEN age BETWEEN 18 and 25 THEN 'Under 25'
    WHEN age BETWEEN 25 and 40 THEN '25 - 40'
    WHEN age >= 40 THEN 'Over 40'
    WHEN age IS NULL THEN 'Not Filled In (NULL)'
END as age_range2,
COUNT(*) AS count2,
 CASE
    WHEN age between 18 and 25 THEN 1
    WHEN age BETWEEN 25 and 40 THEN 2
    WHEN age >= 40 THEN 8
    WHEN age IS NULL THEN 9
END as ordinal

FROM (SELECT TIMESTAMPDIFF(YEAR, users.birthdate_on, CURDATE()) AS age FROM users) as derived2

GROUP BY age_range2
) as test2




ORDER BY ordinal

我想要一个25岁以下的结果,但是25岁以下的493和2046的两个结果在不同的列中。对于所有其他范围也一样

听起来像是要在test2.age\u range2上加入派生的.age\u范围

SELECT
CASE
    WHEN age BETWEEN 18 and 25 THEN 'Under 25'
    WHEN age BETWEEN 25 and 40 THEN '25 - 40'
    WHEN age >= 40 THEN 'Over 40'
    WHEN age IS NULL THEN 'Not Filled In (NULL)'
END as age_range, 
CASE
    WHEN age between 18 and 25 THEN 1
    WHEN age BETWEEN 25 and 40 THEN 2
    WHEN age >= 40 THEN 8
    WHEN age IS NULL THEN 9
    END as ordinal,
    count, count2
FROM (
    SELECT
    derived.age,
    COUNT(*) AS count
    FROM (
        SELECT TIMESTAMPDIFF(YEAR, users.birthdate_on, CURDATE()) AS age FROM users
        join subscriptions on users.id = subscriptions.user_id
        where users.plan <> 'domain' and users.plan <> '' and users.plan <> 'domain_cpi' and users.birthdate_on is not null 
        GROUP BY age
    ) as derived

    JOIN

    SELECT
    derived2.age,
    COUNT(*) AS count2
    FROM (
        SELECT TIMESTAMPDIFF(YEAR, users.birthdate_on, CURDATE()) AS age FROM users
        GROUP BY age
    ) as derived2

    ON derived.age = derived2.age

)
ORDER BY ordinal ASC;

我相信你不需要2个查询,只需要一个左连接。count函数仅递增非空值,因此即使用户不符合订阅条件,也可以对其进行计数

SELECT
      CASE
          WHEN age BETWEEN 18 and 25 THEN 'Under 25'
          WHEN age BETWEEN 25 and 40 THEN '25 - 40'
          WHEN age >= 40 THEN 'Over 40'
          WHEN age IS NULL THEN 'Not Filled In (NULL)'
      END as age_range 
    , CASE
          WHEN age between 18 and 25 THEN 1
          WHEN age BETWEEN 25 and 40 THEN 2
          WHEN age >= 40 THEN 8
          WHEN age IS NULL THEN 9
      END as ordinal
    , COUNT(DISTINCT id)    AS user_count        # distinct might not be needed
    , COUNT(subscriber_id)  AS subscriber_count
FROM (
      SELECT
            users.id
          , TIMESTAMPDIFF(YEAR, users.birthdate_on, CURDATE()) AS age
          , subscriptions.user_id                              AS subscriber_id
      FROM users
      LEFT JOIN subscriptions ON users.id = subscriptions.user_id
            AND users.plan <> 'domain'
            AND users.plan <> ''
            AND users.plan <> 'domain_cpi'
            AND users.birthdate_on IS NOT NULL
      ) d
GROUP BY
      CASE
          WHEN age BETWEEN 18 and 25 THEN 'Under 25'
          WHEN age BETWEEN 25 and 40 THEN '25 - 40'
          WHEN age >= 40 THEN 'Over 40'
          WHEN age IS NULL THEN 'Not Filled In (NULL)'
      END
    , CASE
          WHEN age between 18 and 25 THEN 1
          WHEN age BETWEEN 25 and 40 THEN 2
          WHEN age >= 40 THEN 8
          WHEN age IS NULL THEN 9
      END

那么你希望结果是什么样子的呢???@RiggsFolly,我在最后加了一条评论。如果我需要进一步解释我想做什么,请告诉我。我尝试了一个连接,但出现了以下错误:您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以了解在第28Ah行的“选择,年龄在18到25岁之间时为CASE,年龄在25岁以下时为CASE”附近使用的正确语法。好的,我想我知道需要做什么。。。但这需要时间。在年龄字段中,仅从每个派生表中选择年龄,test2和JOIN。在这之外执行案例。好的,我已经写了我的答案。很容易出现缺陷,因为我在没有任何测试手段的情况下尽可能快地重构了。希望它能为你指明正确的方向?