INNER JOINの条件では、NULL以外の値を持つようにfailed_logins.ip_address
が必要になります。その列のNULL値を持つ行はすべて除外されます。そして、それはfailed_logins
への参加の「外見」を否定します。 (failed_logins
に一致する行を持っていないusers
内の任意の行、外部結合は、一致するダミー行のすべての列はNULLになり、failed_logins
からダミー一致行を発明します。
をので、私たちが必要となりますfailed_logins.ip_address
のNULL
値が返されることを可能にする方法。
1つのオプションは、内部結合外側に加入することを作ることであろう。LEFT
でINNER
を置き換える、すなわち。
このタイプにアプローチする他のいくつかの方法があります。実際にはどのような結果セットを返すかによって異なります。予想される結果は、仕様を明確にするのには長い道のりになります。
EDIT
再読み込み質問した後、それは我々が返さ欲しいもの結果はまだ明らかではありません。なぜbanned
テーブルを見る必要がありますか? 「存在する場合にデータをフィルタリングする」は実際に仕様を説明するものではありません。 は、結果セットから行を除外するために
banned
に一致する行がある場合、我々はしたいですか?または、一致する行が存在しない行をbanned
に戻したいとします。
フォロー
インライン・ビューに(又は、派生テーブル MySQLの用語を使用する)、failed_logins
とbanned
最初の間の結合を行います。そして、users
と派生テーブルの間で外部結合を行います。例として
:
SELECT users.*
, fl.*
FROM users
LEFT
JOIN (SELECT f.user_id
, f.ip_address
FROM failed_logins f
JOIN banned b
ON b.ip_address = f.ip_address
) fl
ON fl.user_id = users.user_id
ORDER BY users.user_id, fl.ip_address
考えるfailed_logins
サンプルデータ:
user_id ip_address
---------- ------------
111 127.0.0.1
111 192.168.0.1
222 127.0.0.1
333 192.168.0.1
444 4.4.4.4
とbanned
サンプルデータ
ip_address
----------
127.0.0.1
とusers
は5行、555から111を含んでいると仮定すると、クエリが返される:
user_id user_id ip_address
------- ------- ----------
111 111 127.0.0.1
222 222 127.0.0.1
333 (null) (null)
444 (null) (null)
555 (null) (null)
これが仕様を満たしていない場合は、期待される出力と一緒に、(と返されてはならない必要がある行の例例を含む)いくつかのサンプルデータを提供することを検討してください。
あなたの質問は私には分かりません..あなたのクエリを更新し、適切なデータサンプルと予想される結果を追加してください。 – scaisEdge
なぜuser.user_idがemails.email_idに等しくなければならないのですか?たぶんあなたは私たちがあなたを助けることができるようにテーブルの構造を追加することができます –
コメントありがとう、私はできる限り明確になるように質問を更新しました。必要に応じてサンプルデータを後で追加しますが、今のところは頭を悩む必要があります。 – Andrew