2012-08-08 70 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;