0

我正在尝试使用下一条语句进行过滤查询:

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 个结果)

请问我做错了什么?

提前致谢!

4

4 回答 4

3

AND优先于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
于 2012-08-08T16:16:06.050 回答
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%")
于 2012-08-08T16:16:17.190 回答
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 .... 这会选择您的所有数据,增加网络开销并占用更多时间在服务器上传输所有数据。

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

于 2012-08-08T16:18:05.453 回答
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;
于 2012-08-09T22:03:20.067 回答