gpt4 book ai didi

mysql - 需要有关正确 SQL 的帮助

转载 作者:可可西里 更新时间:2023-11-01 07:57:38 24 4
gpt4 key购买 nike

所以我是菜鸟、入门者、初学者 - 把以上所有的东西都扔给我。我正在尝试创建一个将搜索数据库并返回 blah blah blah 的查询。问题是,它不太管用。这是一个示例查询 - 如您所见,除其他外,我正在尝试返回姓氏为 Johnson 的人的结果

SELECT BookingInfo.ClinicID, BookingInfo.BookingDate, BookingInfo.BookingTime, 
BookingInfo.Status, PatientBooking.FirstName, PatientBooking.LastName,
PatientBooking.DateOfBirth
FROM BookingInfo LEFT JOIN PatientBooking
ON BookingInfo.PatientID = PatientBooking.PatientID
WHERE PatientBooking.LastName = 'Johnson' AND BookingInfo.ClinicID = '1'
OR BookingInfo.ClinicID = '2'
ORDER BY BookingInfo.BookingDate DESC

这会返回 Johnson 的结果,但也会返回其他人的结果。另一个:

SELECT BookingInfo.ClinicID, BookingInfo.BookingDate, BookingInfo.BookingTime, 
BookingInfo.Status, PatientBooking.FirstName, PatientBooking.LastName,
PatientBooking.DateOfBirth
FROM BookingInfo LEFT JOIN PatientBooking
ON BookingInfo.PatientID = PatientBooking.PatientID
WHERE BookingInfo.BookingDate = '05-18-2010' AND BookingInfo.ClinicID = '1'
OR BookingInfo.ClinicID = '2'
ORDER BY BookingInfo.BookingDate DESC

这会返回我指定日期的结果,但也会返回其他日期。我的语法有问题吗?我不知道我在做什么吗?请帮助初学者。谢谢!

最佳答案

查看 AND 和 OR 之间的优先顺序。

在算术中,乘法的优先级高于加法。

示例:10+10*10 = 110,但 (10+10)*10 = 200。

与 AND 和 OR 类似。 AND 的优先级高于 OR,因此不带括号:

WHERE BookingInfo.BookingDate = '05-18-2010' AND BookingInfo.ClinicID = '1' 
OR BookingInfo.ClinicID = '2'

像这样工作:

WHERE (BookingInfo.BookingDate = '05-18-2010' AND BookingInfo.ClinicID = '1') 
OR BookingInfo.ClinicID = '2'

但你希望它像这样工作:

WHERE BookingInfo.BookingDate = '05-18-2010' AND 
(BookingInfo.ClinicID = '1' OR BookingInfo.ClinicID = '2')

所以放在括号中以确保优先顺序符合您的要求。


我还注意到您正在使用 MM-DD-YYYY 格式的日期,MySQL 无法识别日期文字。您必须使用 YYYY-MM-DD 格式。这可能会导致不同的问题。

SELECT DATE('05-18-2010'); -- returns NULL
SELECT DATE('2010-05-18'); -- returns 2010-05-18

回复你的评论:

Are you sure that AND has a higher precedence?

是的,我确定 AND 的优先级高于 OR。一方面,MySQL 中所有运算符的优先级层次记录在此处: http://dev.mysql.com/doc/refman/5.1/en/operator-precedence.html

让我们使用您最初提出的问题来看一个示例:

BookingDate   ClinicID 
2010-05-18 2
2008-05-18 2

WHERE BookingInfo.BookingDate = '2010-05-18' AND
BookingInfo.ClinicID = '1' OR BookingInfo.ClinicID = '2'

使用这个表达式,只有第一行应该匹配。但是您发现两行匹配,即使第二行的日期不正确。为什么?让我们用 TRUE 或 FALSE 替换每个比较:

TRUE AND FALSE OR TRUE
FALSE AND FALSE OR TRUE

如果 OR 有更高的优先级,它会这样计算:

TRUE AND (FALSE OR TRUE)
FALSE AND (FALSE OR TRUE)

由于任何值与 OR TRUE 结合产生 TRUE,这些括号内的子表达式将简化为:

TRUE AND (TRUE)
FALSE AND (TRUE)

第二行将不匹配,因为 FALSE AND TRUE 会产生 FALSE。但那不可能,因为您发现第二行不正确匹配。

事实上,AND 的优先级高于 OR,因此它的计算实际上就像在 AND 子表达式周围加了括号:

(TRUE AND FALSE) OR TRUE
(FALSE AND FALSE) OR TRUE

减少为:

(FALSE) OR TRUE
(FALSE) OR TRUE

在这两种情况下,FALSE OR TRUE 都会产生 TRUE,并且两行都匹配。

因此,如果没有括号,默认语义是 AND 的优先级高于 OR。你需要括号:

WHERE BookingInfo.BookingDate = '2010-05-18' AND 
(BookingInfo.ClinicID = '1' OR BookingInfo.ClinicID = '2')

关于mysql - 需要有关正确 SQL 的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3154102/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com