【问题标题】:I have to join two select queries我必须加入两个选择查询
【发布时间】:2020-03-04 11:35:40
【问题描述】:

我必须加入两个选择查询,并且我正在使用 UNION

SELECT 
    DATE(post_orders.created),
    count(post_orders.id) as total_sales_today,
    SUM(IF(user_leads.event_type = 'IN', 1, 0)) as sales_count_inquiry,
    SUM(IF(user_leads.event_type = 'EN', 1, 0)) as sales_count_enroll_now
FROM
    post_orders
    left JOIN 
    user_leads ON post_orders.userid = user_leads.user_id
        AND post_orders.courseid = user_leads.course_id
WHERE
    DATE(post_orders.created) <= '2020-03-03'
    and DATE(post_orders.created) > '2019-10-20'
group by DATE(post_orders.created);


SELECT
  DATE(user_leads.created),
  COUNT(user_leads.id) AS lead_count,
  SUM(IF(users.country = 'IN', 1, 0)) as lead_count_india,
  SUM(IF(users.country = 'US', 1, 0)) as lead_count_usa,
  SUM(IF(users.country <> 'IN' and users.country <> 'US', 1, 0)) as lead_count_row,
  SUM(IF(user_leads.event_type = 'EN' and users.country = 'US', 1, 0)) as lead_count_enrollnow_us
FROM
  user_leads 
  join courses on user_leads.course_id = courses.id
  join users on user_leads.user_id = users.id
WHERE
  DATE(user_leads.created) >= '2019-10-20'
      AND DATE(user_leads.created) < '2020-03-03'
      AND courses.course_type !=4
GROUP BY DATE(user_leads.created) DESC;

但是我收到了这个错误: 使用的 SELECT 语句有不同的列数 0.238 秒 让我知道我哪里错了,我该如何解决?

【问题讨论】:

  • 您应该提供样本数据和期望的结果。
  • 这两个查询的结果是完全不同的列。您希望由此产生的联合会是什么样子?
  • JOIN 和 UNION 是两个完全不同的东西......展示查询输出(足够 2 条记录)和它们的最终结果。我建议指定 MySQL 版本。

标签: mysql sql


【解决方案1】:

UNION 在这种情况下毫无意义。每个日期您最终会得到两行,一行包含有关销售的信息,另一行包含有关潜在客户的信息。而且,你没有任何东西表明哪一行是哪一行。

我很确定你想要的是实际的 JOIN,而不是 UNION

SELECT *
FROM (SELECT DATE(po.created) as dte,
             COUNT(*) as total_sales_today,
             SUM(ul.event_type = 'IN') as sales_count_inquiry,
             SUM(ul.event_type = 'EN') as sales_count_enroll_now
      FROM post_orders po LEFT JOIN
           user_leads ul
           ON po.userid = ul.user_id AND
              po.courseid = ul.course_id
      WHERE po.created < '2020-03-04'
            po.created >= '2019-10-21'
      GROUP BY DATE(po.created)
     ) pol LEFT JOIN
     (SELECT DATE(ul.created) as dte,
             COUNT(*) AS lead_count,
             SUM(u.country = 'IN') as lead_count_india,
             SUM(u.country = 'US') as lead_count_usa,
             SUM(u.country <> 'IN' and u.country <> 'US') as lead_count_row,
             SUM(ul.event_type = 'EN' and u.country = 'US') as lead_count_enrollnow_us
      FROM user_leads ul JOIN
           courses c
           ON ul.course_id = c.id JOIN
           users u
           ON ul.user_id = u.id
      WHERE ul.created >= '2019-10-21' AND
            ul.created < '2020-03-04' AND
            c.course_type <> 4
      GROUP BY DATE(ul.created) DESC
     ) l
     USING (dte);

注意事项:

  • 表别名使查询更易于编写和阅读。
  • MySQL 为您正在使用的SUM(IF()) 逻辑提供了一个方便的简写。它将布尔值视为数字,“1”代表真,“0”代表假。
  • WHEREON 子句中使用函数DATE() 会阻止使用索引(并可能影响其他优化)。我修改了逻辑以删除该功能。

【讨论】:

  • @ashishmishra 我认为它在 where 子句中被引用。
  • 哦,明白了。衷心感谢
【解决方案2】:

你有这个:

select t1.1
       , t1.2
       , t1.3
       , t1.4
from mytable t1
union
select t2.1
       , t2.2
       , t2.3
       , t2.4
       , t2.5
       , t2.5
from mytable t2

你需要这个才能让联合取得成功:

select t1.1
       , t1.2
       , t1.3
       , t1.4
from mytable t1
union
select t2.1
       , t2.2
       , t2.3
       , t2.4
from mytable2 t2

问题是第一次选择的 select 子句中的列数与第二次选择的列数不同。


另外,假设第一个选择给出了这个结果:

| t1.1 | t1.2 | t1.3 | t1.4 |
|  1   |   2  |  3   |   4  |

让我们想象第二个给出了这样的结果:

| t2.1 | t2.2 | t2.3 | t2.4 |
|  5   |   6  |  7   |   8  |

Union 会给你这个结果:

| t1.1 | t1.2 | t1.3 | t1.4 |
|  1   |   2  |  3   |   4  |
|  5   |   6  |  7   |   8  |

其中一个连接会给你这个结果:

| t1.1 | t1.2 | t1.3 | t1.4 | t2.1 | t2.2 | t2.3 | t2.4 |
|  1   |   2  |  3   |   4  |  5   |   6  |  7   |   8  |

希望这会有所帮助。 干杯!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-30
    • 2017-10-20
    • 2019-09-24
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多