【问题标题】:How to join and give a default if a value is in one table but not another?如果一个值在一个表中但不在另一个表中,如何加入并给出默认值?
【发布时间】:2017-07-06 09:02:24
【问题描述】:

我正在使用 MySQL,而且我是新手! 希望你们能帮我解答一个 SQL 问题。

假设我有 2 个表,我想要一个简单的连接。

表 1:

   id | service_id | user_number
   ----------------------------------------------------------------------
   0  | 1001       | 10
   1  | 1002       | 20
   2  | 1004       | 40

表 2:

   id | service_id | error_number
   ----------------------------------------------------------------------
   0  | 1001       | 1000
   1  | 1003       | 3000
   2  | 1004       | 4000

我想在service_id 上进行连接,如果不存在,则将user_numbererror_number 的默认值设为0。 所以:

   id | service_id | user_number | error_number
   ----------------------------------------------------------------------
   0  | 1001       | 10          | 1000
   1  | 1002       | 20          | 0
   3  | 1003       | 0           | 3000
   2  | 1004       | 40          | 4000

我尝试了一些查询,但他们一直给我null 而不是 0。 非常感谢。

【问题讨论】:

  • 向我们展示你的尝试:)

标签: mysql sql database


【解决方案1】:

这里你应该先使用union,然后进行聚合:

select t.`service_id`, sum(t.`user_number`) as `user_number`, sum(t.`error_number`) as `error_number`
from (
    select `service_id`, `user_number`, 0 as `error_number` from t1
    union
    select `service_id`, 0 as `user_number`, `error_number` from t2
) t
group by `service_id`

demo 在这里。

【讨论】:

    【解决方案2】:

    你可以试试这个,伙计:

    SELECT
        t1.id,
        t1.service_id, 
        COALESCE(tb1.user_number, 0) `user_number`,
        COALESCE(tb2.error_number, 0) `error_number`
    FROM
        (
            SELECT id, service_id
            FROM table1
            UNION
            SELECT id, service_id
            FROM table2
        ) t1
        LEFT JOIN table1 tb1 ON tb1.service_id = t1.service_id
        LEFT JOIN table2 tb2 ON tb2.service_id = t1.service_id;
    

    【讨论】:

      【解决方案3】:

      试试这个:

      select COALESCE(t1_service,t2_service ) as service_id, COALESCE(user_number,0) as user_number , COALESCE(error_number,0) as error_number 
      from (
       select t1.service_id as t1_service , t1.user_number , t2.error_number, t2.service_id as t2_service 
       from table_1  t1
       LEFT OUTER JOIN table_2 t2  
       on t1.service = t2.service
      union 
       select t1.service_id as t1_service , t1.user_number , t2.error_number, t2.service_id as t2_service 
       from table_1  t1  
       Right OUTER JOIN table_2 t2   
       on t1.service = t2.service
      )z1
      order by service_id
      

      【讨论】:

        猜你喜欢
        • 2014-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-19
        • 1970-01-01
        • 1970-01-01
        • 2019-03-05
        • 1970-01-01
        相关资源
        最近更新 更多