我正在尝试使用下一个语句进行过滤查询:
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 :(得分: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
答案 1 :(得分: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%")
答案 2 :(得分: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 :(得分: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;