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 は users.id の FK です。

ユーザーをフィルタリングして、指定された値と同様の値を持つユーザーを取得しようとしています。実行すると、非常に長いループが発生し、最終的に重複を含むユーザーの大きなリストが表示されます。(たとえば、ユーザーが 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

テーブルに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 に答える
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 に答える