簡體   English   中英

在LEFT JOIN中使用OR條件

[英]Using an OR condition in LEFT JOIN

這是我在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

目標是在結果的第二個表中插入“ is_fullday”和“ slot”列,以檢查是否與時間表有沖突,因為可以在任何人在表“ blocco_operativo”中創建記錄之前就預定約會

現在這似乎可行,但是我不確定第二個JOIN中的“ OR”條件是否是最佳解決方案。 可以,還是我想念什么?

非常接近。 我認為在全天情況下,您根本不需要檢查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)

您可以將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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM