2010-06-30 121 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