在LEFT JOIN中使用OR条件

时间:2017-03-27 15:04:56

标签: mysql left-join outer-join or-condition

这是我在2个表格中的内容。

表tbl_appuntamento =>该表包含约会列表

    +------+----------------------+-----------+---------+
    | id   | data                 | slot      | id_sede |
    +------+----------------------+-----------+---------+
    | 1    | 2017-03-27           | 10:00:00  | 1       |
    | 2    | 2017-03-27           | 10:00:00  | 1       |
    | 3    | 2017-03-28           | 11:00:00  | 1       |
    | 4    | 2017-03-28           | 12:00:00  | 1       |
    +------+----------------------+-----------+---------+

表tbl_blocco_operativo =>该表包含一个日期或时段列表,其中不能设置约会

    +------+----------------------+-----------+---------+------------+
    | id   | data                 | slot      | id_sede | is_fullday |
    +------+----------------------+-----------+---------+------------+
    | 1    | 2017-03-27           | 10:00:00  | 1       |0           |
    | 2    | 2017-03-27           | 11:00:00  | 1       |0           |
    | 3    | 2017-03-28           | 00:00:00  | 1       |1           |
    +------+----------------------+-----------+---------+------------+

我有这个查询

    SELECT appuntamento.*,blocco.slot blockSlot, blocco.is_fullday blockFullday 
    FROM tbl_appuntamento appuntamento 
    LEFT JOIN tbl_argomento argomento ON argomento.id = appuntamento.id_argomento
    LEFT JOIN  tbl_blocco_operativo blocco ON blocco.data = appuntamento.data AND blocco.id_sede = appuntamento.id_sede 
        AND ((blocco.is_fullday = 0 AND blocco.slot = appuntamento.slot) 
             OR (blocco.is_fullday = 1 AND blocco.slot <> appuntamento.slot))
    WHERE appuntamento.id_sede = :locationId
    AND appuntamento.data >= :startDate
    AND appuntamento.data <= :endDate
    GROUP BY appuntamento.id
    ORDER BY appuntamento.data, appuntamento.slot

目标是插入列&#34; is_fullday&#34;和&#34;插槽&#34;从结果的第二个表中,检查是否与计划有任何冲突,因为可以在任何人在表格中创建记录之前预约约会&#34; blocco_operativo&#34;

现在这似乎有效,但我不确定&#34; OR&#34;第二个JOIN中的条件是最佳解决方案。 没关系,或者我错过了什么?

2 个答案:

答案 0 :(得分:2)

非常接近。我认为在整个案例中你根本不需要检查slot。如果您在00:00位置安排了约会,那么您编写它的方式将被视为可用的全部位置。 (如果业务在午夜不开放,也许实际上并没有出现。)

LEFT JOIN  tbl_blocco_operativo blocco ON blocco.data = appuntamento.data AND blocco.id_sede = appuntamento.id_sede 
    AND ((blocco.is_fullday = 0 AND blocco.slot = appuntamento.slot) 
         OR blocco.is_fullday = 1)

答案 1 :(得分:1)

您可以将OR表达式替换为:

blocco.is_fullday = (blocco.slot <> appuntamento.slot)

这是有效的,因为括号内的布尔表达式将对应于数字0或1,这正是您希望blocco.is_fullday进行比较的结果。

以更详细的方式,这可以写成:

blocco.is_fullday = case blocco.slot when appuntamento.slot then 0 else 1 end

全日案例

如果整天被阻止,您可能会认为插槽无关紧要。在这种情况下,条件可以减少到:

(blocco.is_fullday = 1 OR blocco.slot = appuntamento.slot)

由于is_fullday的作用类似于布尔值,您可以说:

(blocco.is_fullday OR blocco.slot = appuntamento.slot)