2012-08-08 101 views
0

我嘗試使用下面的語句做一個篩選器查詢:SELECT語句問題,或者

SELECT * FROM user_jobs,users WHERE user_jobs.job_title LIKE "%some_keyword%" **OR** user_jobs.job_title LIKE "%another_keyword%" AND user.id=user_jobs.userid 

規格:users.id是PK和user_jobs.userid是FK到users.id

我正在嘗試過濾用戶以獲取具有與指定值類似的值。當我運行它時,我得到一個非常長的循環,最後是包含重複項的大量用戶列表。 (例如,我只有300個用戶,查詢顯示3000多個結果)

我在做什麼錯誤?

在此先感謝!

回答

0

首先,在這種情況下,AND運算符優先。隔離你的邏輯是這樣的:

SELECT * FROM user_jobs,users WHERE (user_jobs.job_title LIKE "%some_keyword%" OR user_jobs.job_title LIKE "%another_keyword%") AND user.id=user_jobs.userid 

其次,不要使用SELECT * FROM ...。這將選擇所有數據,增加網絡開銷並花費更多時間將其傳輸到整個服務器。

參考http://dev.mysql.com/doc/refman/5.0/en/func-op-summary-ref.html

3

AND takes precedence over OR;使用括號來達到所需的結果。

SELECT * FROM user_jobs, users 
WHERE 
    (user_jobs.job_title LIKE "%some_keyword%" 
    OR user_jobs.job_title LIKE "%another_keyword%") 
AND users.id = user_jobs.userid 
+0

非常感謝您! – 2012-08-08 16:18:29

1

您需要在該查詢中使用圓括號。

SELECT * FROM user_jobs,users WHERE user.id=user_jobs.userid 
AND (user_jobs.job_title LIKE "%some_keyword%" 
OR user_jobs.job_title LIKE "%another_keyword%") 
+0

謝謝!現在修好! – 2012-08-08 16:18:45

0

即使你表包含300條記錄將導致大約3000條記錄,因爲您選擇的兩個表列,但不給你查詢的任何連接條件,所以它會CROSS JOIN兩表格。

和尋找`JOB_TITLE圖案,你可以使用正則表達式也爲

SELECT * FROM USER_JOBS T1,USERS T2 WHERE REGEXP_LIKE(USER_JOBS.JOB_TITLE ,'SOME_KEYWORD|OTHER_KEYWORD') AND T2.ID=T1.USERID;