2010-06-30 104 views
3

所以我是一个noobie,初学者,初学者 - 把以上所有的东西都扔给我。我试图创建一个查询,将搜索数据库并返回等等等等等等。问题是,它不是很有效。这里有一个例子查询 - 正如你所看到的,上面其他的事情,我想从别人姓为返回结果约翰逊需要正确的SQL帮助

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 

这将返回结果与约翰逊,但其他人。另:

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 

这将返回从我指定的日期的结果,但其他人。我的语法错了吗?我不知道我在做什么?请帮助初学者。谢谢!

+6

AND和OR越来越困惑。将两个OR条件放入一组括号中并尝试。 – 2010-06-30 23:18:14

回答

0

信贷应该去@Randolph波特:

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 
+0

Randolph - 如果你想复制这个答案,我会删除我的。 – 2010-06-30 23:20:46

+0

保持积分。我没有耐心写下全部内容:-) – 2010-06-30 23:57:53

1

这可能是因为你没有在你的OR条件括号。尝试下面的更新版本:

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 IN ('1', '2') 
ORDER BY BookingInfo.BookingDate DESC 

此外,添加一点格式化到您的SQL将使它更可读。这将帮助您在SO上获得答案,并帮助任何最终查看代码的人。

+0

TY为更正OMGP;) – 2010-06-30 23:37:55

+0

呃,只是语法糖:) – 2010-06-30 23:47:34

0

您需要在OR之前的WHERE子句的部分周围添加括号。在第一个例子,你意思

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 

但由于AND的优先级高于OR,你是什么实际上做

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 

因此,你会看到行其中ClinicID等于2;不只是约翰逊的。

5

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

在算术中,乘法具有比加法更高的优先级。

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

这是一个与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格式。这可能会导致一个不同的问题。

​​

回复您的评论:

你确定且具有更高的优先级?

是的,我确定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 

如果或有更高的优先级,它会评价是这样的:

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

因为任何值与或组合TRUE产量TRUE,里面这些子表达式括号会减少到:

TRUE AND (TRUE) 
FALSE AND (TRUE) 

而第二行不匹配,因为假和真产生FALSE。但那不可能,因为你发现第二行不正确匹配。

事实上,具有小于或更高的优先级,所以它真的计算,如果你有周围和子表达式括号:

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

可降低到:

(FALSE) OR TRUE 
(FALSE) OR TRUE 

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

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

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

你确定'AND'具有更高的优先?我在这个页面上测试了它http://sqlzoo.net/3b.htm,在我看来,这些语句是从左到右以相同的优先级执行的(当然不包括括号)。 – Nitrodist 2010-07-01 00:38:40

0

如果你把括号括在2 ClinicID条件,它应该工作。

见下文:

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 

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