我有以下查询的下一个结果:
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_task
和id_booking
重复时,我试图让寄存器不为空type
但是如果我引入子句GROUP BY我就可以得到第一个寄存器id_task
= NULL。
是否有可能在GROUP BY分组的多个寄存器之间取值为空值的寄存器?
答案 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