[英]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.