Sql ";其中;工作条件不符合预期(“或”问题)
我在连接这4个表时遇到问题 我想计算不同种类的预订数量(用户[mrbs_users.id]、房间[mrbs_room.room_id]、面积[mrbs_area.area_id]) 但是,当我执行此查询时(对于用户(id=1)) 结果是每个用户的预订总数,而不仅仅是拥有Sql ";其中;工作条件不符合预期(“或”问题),sql,Sql,我在连接这4个表时遇到问题 我想计算不同种类的预订数量(用户[mrbs_users.id]、房间[mrbs_room.room_id]、面积[mrbs_area.area_id]) 但是,当我执行此查询时(对于用户(id=1)) 结果是每个用户的预订总数,而不仅仅是拥有id=1的用户 所以如果有人能帮我。。提前感谢。当您有多个条件时,请在where子句中使用括号。您的,其中解析为: WHERE (mrbs_entry.start_time BETWEEN "145811700" and "14
id=1
的用户
所以如果有人能帮我。。提前感谢。当您有多个条件时,请在
where
子句中使用括号。您的,其中
解析为:
WHERE (mrbs_entry.start_time BETWEEN "145811700" and "1463985000" ) or
(mrbs_entry.end_time BETWEEN "1458120600" and "1463992200" and
mrbs_users.id = 1
)
你大概打算:
WHERE (mrbs_entry.start_time BETWEEN 145811700 and 1463985000 or
mrbs_entry.end_time BETWEEN 1458120600 and 1463992200
) and
mrbs_users.id = 1
此外,我删除了字符串常量周围的引号。混合数据类型是一种不好的做法,在某些数据库中,类型之间的转换会降低查询效率。您所面临的问题是由不正确的条件
WHERE
引起的因此,我们应该:
WHERE (mrbs_entry.start_time BETWEEN 145811700 AND 1463985000 )
OR
(mrbs_entry.end_time BETWEEN 1458120600 AND 1463992200 AND mrbs_users.id = 1)
此外,当您仅使用内部联接
(联接
)时,最好避免使用WHERE
子句,因为ON
子句在WHERE
子句之前执行,因此那里的条件执行得更快在本例中,您的查询应如下所示:
SELECT COUNT(*)
FROM mrbs_users
JOIN mrbs_entry ON mrbs_users.name=mrbs_entry.create_by
JOIN mrbs_room ON mrbs_entry.room_id = mrbs_room.id
AND
(mrbs_entry.start_time BETWEEN 145811700 AND 1463985000
OR ( mrbs_entry.end_time BETWEEN 1458120600 AND 1463992200 AND mrbs_users.id = 1)
)
JOIN mrbs_area ON mrbs_room.area_id = mrbs_area.id
非常感谢。但是当我使用你的第一个WHERE(…)时,结果是23,第二个WHERE(…)的结果是17。我不明白为什么我有不同的结果。好的,但我的结果是“#1305-功能mrbs_room.id不存在”我不明白这个错误哦,我忘记了添加
和在第一次加入标准后,请参阅更新的帖子哦是的,谢谢我不再有错误,但当我更改用户时,结果总是一样的。你知道问题出在哪里吗?@VincentDUPONT这不是问题,这意味着第二个条件没有实现。要验证是否只需删除第一个条件,您将看到任何记录是否满足条件mrbs_entry.end_time介于1458120600和1463992200之间,并且mrbs_users.id=1
SELECT COUNT(*)
FROM mrbs_users
JOIN mrbs_entry ON mrbs_users.name=mrbs_entry.create_by
JOIN mrbs_room ON mrbs_entry.room_id = mrbs_room.id
AND
(mrbs_entry.start_time BETWEEN 145811700 AND 1463985000
OR ( mrbs_entry.end_time BETWEEN 1458120600 AND 1463992200 AND mrbs_users.id = 1)
)
JOIN mrbs_area ON mrbs_room.area_id = mrbs_area.id