这是我在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中的条件是最佳解决方案。 没关系,或者我错过了什么?
答案 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)