web-dev-qa-db-ja.com

MySQL LEFT JOIN複数条件

「group_id」でリンクされたAとBの2つのテーブルがあります。
2つの変数を使用しています:$keyword, $_SESSION['user_id']

[〜#〜] a [〜#〜]
group_id
キーワード

[〜#〜] b [〜#〜]
id
group_id
ユーザーID

キーワード検索に基づいて、このユーザーが含まれていないすべてのグループを選択できるようにします。

したがって、目標は、Aのすべての行を選択し、Bの対応するgroup_idのuser_id!= {$ _ SESSION ['user_id'} ANDキーワードと同様です。

これは私が試したものです:

SELECT a.* 
FROM a 
LEFT JOIN b ON a.group_id=b.group_id 
WHERE a.keyword LIKE '%".$keyword."%' 
AND b.user_id!=$_SESSION{['user_id']} 
GROUP BY group_id

ただし、AND b.user_id!=$_SESSION{['user_id']}を削除しない限り、行(一致)は検出されません。その場合、ユーザーが既に存在するグループも含まれます。

助けていただければ幸いです!ありがとう

25
Jon Robinson

余分な条件をJOIN ON条件に移動するだけです。この方法では、結果を返すためにbが存在する必要はありません。

SELECT a.* FROM a 
    LEFT JOIN b ON a.group_id=b.group_id AND b.user_id!=$_SESSION{['user_id']} 
    WHERE a.keyword LIKE '%".$keyword."%' 
    GROUP BY group_id
39
Bryan

正解は単純です:

SELECT a.group_id
FROM a 
LEFT JOIN b ON a.group_id=b.group_id  and b.user_id = 4
where b.user_id is null
  and a.keyword like '%keyword%'

ここで確認していますuser_id = 4(セッションからのユーザーID)。結合基準に含まれているため、基準に一致しないテーブルbの行(つまり、user_idが含まれていないグループ)に対してNULL値を返します。

そこから、必要なのはnull値をフィルター処理するだけで、ユーザーが所属していないすべてのグループがあります。

ここにデモ

12
pala_