2016-07-29 17 views
0

タイトルはかなりシンプルに聞こえます...主な問題は、どの方向にクエリを行い、どのように結果を出力するかです。複数の列でのMySQLの検索

ここで空の検索とスクリーンショットです:クライアントは常に(検索クエリに一致する)表示されている必要があり

enter image description here

。だからここにいくつかの例:のProject2ため

  • 検索するのProject2で出力CLIENT2
  • CLIENT2ため
  • 検索する必要があり、すべてのプロジェクトと出力CLIENT2クライアント3用
  • 検索する出力クライアント3私が照会

プロジェクトを作成し、このようなクライアントに参加する:

SELECT * 
FROM projects AS a 
LEFT JOIN clients AS b ON a.client_id = b.id 
WHERE a.name LIKE '%$searchString%' OR b.name LIKE '%$searchString%' 

その後、私はクエリfまたは上記のクエリで取得されたこれらを除くクライアント。それは、私が知っている唯一の方法で、プロジェクトを持たないクライアントを得ることです。

クエリでこれらの結果を取得できる文がありますか?これは私にとってあまり優雅ではないようです。また、私はclient2 project1を検索する場合、システムが失敗します。

編集:これまでの回答に感謝します。私はmysqlでは不可能な完全な結合で多くを得ました。私は、質問のタイトルとタグでそれを変更しました...申し訳ありません。完全な結合については何も知らなかったし、mysqlでは可能ではないこともわかった。

+0

を書くことができます。 –

+0

または、左の結合にNULLプロジェクトが含まれるように、または同じ順序を維持して右の結合に切り替えるように、テーブルの順序を切り替えます。 –

答えて

0

RIGHT JOINを実行すると、プロジェクトがあるかどうかにかかわらずすべてのクライアントが提供され、WHERE a.name IS NULLはプロジェクトなしでクライアントのみを提供します。

だから、全体のクエリが

SELECT * 
FROM projects AS a 
RIGHT JOIN clients AS b ON a.client_id = b.id 
WHERE a.name IS NULL 
1

Hereのように見えるSQLで異なる参加型の良い視覚的に表現したものです。

SQLインジェクション攻撃が発生する方法であるため、準備された文を使用していて、直接searchStringをクエリに入れないようにしてください。

SELECT 
    * 
FROM 
    clients b LEFT OUTER JOIN 
    projects AS a ON a.client_id = b.id 
WHERE 
    a.name LIKE '%$searchString%' OR 
    b.name LIKE '%$searchString%' 
+0

投稿していただきありがとうございます。私はすでにSQLインジェクションについて知っています –

0

あなたは `FULL OUTER JOIN`に` LEFT JOIN`を変更してみてください。この

SELECT 
     * 
    FROM 
     clients b FULL OUTER JOIN 
     projects AS a ON a.client_id = b.id 
    WHERE 
     a.name LIKE '%$searchString%' OR 
    b.name LIKE '%$searchString%' 
関連する問題