在GROUP BY列中选择非空值的寄存器

时间:2016-10-14 14:14:23

标签: mysql sql

我有以下查询的下一个结果:

enter image description here

SELECT `id_booking`, `id_task`, `type`, `date`
FROM (SELECT `id` AS `id_booking`, null AS `id_task`, 1 AS `type`, `date_in` AS `date`
    FROM `booking`
    WHERE `date_in` <= '2016-10-24'
    AND `date_in` >= '2016-10-14'
    AND `status` = 'accepted'
    UNION ALL
    SELECT `id` AS `id_booking`, null AS `id_task`, 2 AS `type`, `date_out` AS `date`
    FROM `booking`
    WHERE `date_out` <= '2016-10-24'
    AND `date_out` >= '2016-10-14'
    AND `status` = 'accepted'
    UNION ALL
    SELECT `booking_id` AS `id_booking`, `id` AS `id_task`, `id_type` AS `type`, `date` AS `date`
    FROM `task`
    WHERE `date` <= '2016-10-24'
    AND `date` >= '2016-10-14')
    AS `tasks`
ORDER BY `date` ASC

id_taskid_booking重复时,我试图让寄存器不为空type但是如果我引入子句GROUP BY我就可以得到第一个寄存器id_task = NULL。

是否有可能在GROUP BY分组的多个寄存器之间取值为空值的寄存器?

1 个答案:

答案 0 :(得分:0)

有点复杂......

但是从select union的结果中你应该只选择id whit duplicated rows,为此只选择非null类型

SELECT `id_booking`, `id_task`, `type`, `date`
  FROM (SELECT `id` AS `id_booking`, null AS `id_task`, 1 AS `type`, `date_in` AS `date`
      FROM `booking`
      WHERE `date_in` <= '2016-10-24'
      AND `date_in` >= '2016-10-14'
      AND `status` = 'accepted'
      UNION ALL
      SELECT `id` AS `id_booking`, null AS `id_task`, 2 AS `type`, `date_out` AS `date`
      FROM `booking`
      WHERE `date_out` <= '2016-10-24'
      AND `date_out` >= '2016-10-14'
      AND `status` = 'accepted'
      UNION ALL
      SELECT `booking_id` AS `id_booking`, `id` AS `id_task`, `id_type` AS `type`, `date` AS `date`
      FROM `task`
      WHERE `date` <= '2016-10-24'
      AND `date` >= '2016-10-14') AS `tasks`
  where  (`id_booking`,  `type`) in (  select `id_booking`,  `type` FROM 
            (SELECT `id` AS `id_booking`, null AS `id_task`, 1 AS `type`, `date_in` AS `date`
                FROM `booking`
                WHERE `date_in` <= '2016-10-24'
                AND `date_in` >= '2016-10-14'
                AND `status` = 'accepted'
                UNION ALL
                SELECT `id` AS `id_booking`, null AS `id_task`, 2 AS `type`, `date_out` AS `date`
                FROM `booking`
                WHERE `date_out` <= '2016-10-24'
                AND `date_out` >= '2016-10-14'
                AND `status` = 'accepted'
                UNION ALL
                SELECT `booking_id` AS `id_booking`, `id` AS `id_task`, `id_type` AS `type`, `date` AS `date`
                FROM `task`
                WHERE `date` <= '2016-10-24'
                AND `date` >= '2016-10-14') t
                group by  `id_booking`,  `type`
                having count(*) > 1         
    ) 
  and id_task is not null 

union  

SELECT `id_booking`, `id_task`, `type`, `date`
  FROM (SELECT `id` AS `id_booking`, null AS `id_task`, 1 AS `type`, `date_in` AS `date`
      FROM `booking`
      WHERE `date_in` <= '2016-10-24'
      AND `date_in` >= '2016-10-14'
      AND `status` = 'accepted'
      UNION ALL
      SELECT `id` AS `id_booking`, null AS `id_task`, 2 AS `type`, `date_out` AS `date`
      FROM `booking`
      WHERE `date_out` <= '2016-10-24'
      AND `date_out` >= '2016-10-14'
      AND `status` = 'accepted'
      UNION ALL
      SELECT `booking_id` AS `id_booking`, `id` AS `id_task`, `id_type` AS `type`, `date` AS `date`
      FROM `task`
      WHERE `date` <= '2016-10-24'
      AND `date` >= '2016-10-14') AS `tasks`
  where  (`id_booking`,  `type`) in (  select `id_booking`,  `type` FROM 
            (SELECT `id` AS `id_booking`, null AS `id_task`, 1 AS `type`, `date_in` AS `date`
                FROM `booking`
                WHERE `date_in` <= '2016-10-24'
                AND `date_in` >= '2016-10-14'
                AND `status` = 'accepted'
                UNION ALL
                SELECT `id` AS `id_booking`, null AS `id_task`, 2 AS `type`, `date_out` AS `date`
                FROM `booking`
                WHERE `date_out` <= '2016-10-24'
                AND `date_out` >= '2016-10-14'
                AND `status` = 'accepted'
                UNION ALL
                SELECT `booking_id` AS `id_booking`, `id` AS `id_task`, `id_type` AS `type`, `date` AS `date`
                FROM `task`
                WHERE `date` <= '2016-10-24'
                AND `date` >= '2016-10-14') t
                group by  `id_booking`,  `type`
                having count(*) = 1         
    ) 
  and id_task is  null 

ORDER BY `date` ASC