【问题标题】:SELECT statement issue with OROR 的 SELECT 语句问题
【发布时间】:2012-08-05 19:32:40
【问题描述】:

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

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 是 users.id 的 FK

我正在尝试过滤用户以获取与指定值相似的用户。当我运行它时,我得到一个很长的循环,最后是一个包含重复项的大量用户列表。 (例如,我只有 300 个用户,查询显示超过 3000 个结果)

请问我做错了什么?

提前致谢!

【问题讨论】:

    标签: mysql sql select filter


    【解决方案1】:

    首先,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

    【讨论】:

      【解决方案2】:

      即使您的表包含 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;
      

      【讨论】:

        【解决方案3】:

        您需要在该查询中使用括号。

        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%")
        

        【讨论】:

          【解决方案4】:

          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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-08-13
            • 1970-01-01
            • 2023-04-11
            • 1970-01-01
            • 2012-02-25
            • 2016-04-26
            • 2014-10-07
            • 1970-01-01
            相关资源
            最近更新 更多