2017-02-01 9 views
0

データが存在する場合と存在しない場合があるので、Left Joinを使用する状況を処理する方法。しかし、Left Joinが何らかのデータを見つけたら、左結合データを別のテーブルに結合することによって、左結合データをさらに制限したいのですか? (結果から元のデータを削除することなく)。追加条件で追加/参加する

さらにJoinWhere、またはサブクエリが必要な場合があります。

SELECT users.*, failed_logins.* 
FROM users 
LEFT JOIN failed_logins ON failed_logins.user_id = users.user_id 
INNER JOIN banned ON banned.ip_address = failed_logins.ip_address 

しかし、これはfailed_loginsに一致するbannedにデータがない場合に表示すべきデータが発生していない:ここで

は、私が試したものです。

bannedに一致する行がある場合は、bannedfailed_loginsの行を含める必要があります。それ以外の場合は、failed_loginsbannedの行を除外する必要があります。しかし、データは常にusersから取得する必要があります。

+1

あなたの質問は私には分かりません..あなたのクエリを更新し、適切なデータサンプルと予想される結果を追加してください。 – scaisEdge

+0

なぜuser.user_idがemails.email_idに等しくなければならないのですか?たぶんあなたは私たちがあなたを助けることができるようにテーブルの構造を追加することができます –

+0

コメントありがとう、私はできる限り明確になるように質問を更新しました。必要に応じてサンプルデータを後で追加しますが、今のところは頭を悩む必要があります。 – Andrew

答えて

2

INNER JOINの条件では、NULL以外の値を持つようにfailed_logins.ip_addressが必要になります。その列のNULL値を持つ行はすべて除外されます。そして、それはfailed_loginsへの参加の「外見」を否定します。 (failed_loginsに一致する行を持っていないusers内の任意の行、外部結合は、一致するダミー行のすべての列はNULLになり、failed_loginsからダミー一致行を発明します。

をので、私たちが必要となりますfailed_logins.ip_addressNULL値が返されることを可能にする方法。

1つのオプションは、内部結合外側に加入することを作ることであろう。LEFTINNERを置き換える、すなわち。

このタイプにアプローチする他のいくつかの方法があります。実際にはどのような結果セットを返すかによって異なります。予想される結果は、仕様を明確にするのには長い道のりになります。


EDIT

再読み込み質問した後、それは我々が返さ欲しいもの結果はまだ明らかではありません。なぜbannedテーブルを見る必要がありますか? 「存在する場合にデータをフィルタリングする」は実際に仕様を説明するものではありません。 は、結果セットから行を除外するために

bannedに一致する行がある場合、我々はしたいですか?または、一致する行が存在しない行をbannedに戻したいとします。


フォロー

インライン・ビューに(又は、派生テーブル MySQLの用語を使用する)、failed_loginsbanned最初の間の結合を行います。そして、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) 

これが仕様を満たしていない場合は、期待される出力と一緒に、(と返されてはならない必要がある行の例例を含む)いくつかのサンプルデータを提供することを検討してください。

+0

努力をいただきありがとうございます。できる限り明確になるように質問を更新しました。必要に応じてサンプルデータを後で追加しますが、今のところは頭を悩む必要があります。 – Andrew

関連する問題