2016-04-26 6 views
1

私は、コンテンツが検索と一致するすべてのバリアントを取得するクエリを作成しようとしています。リンクされたフィールドが一致したときにMySQLが行を選択する

------------------------------------------- 
| ID | Product | Variant | Option | Content | 
------------------------------------------- 
| 1 | Shirt | 1  | size | S  | 
| 2 | Shirt | 1  | color | red  | 
| 3 | Shirt | 2  | size | M  | 
| 4 | Shirt | 2  | color | red  | 
| 5 | Shirt | 3  | size | L  | 
| 6 | Shirt | 3  | color | red  | 
------------------------------------------- 

そして結果:私は結果のようなものになりたいコンテンツ=「赤」

------------------------------------------- 
| ID | Product | Variant | Option | Content | 
------------------------------------------- 
| 1 | Shirt | 1  | size | S  | 
| 2 | Shirt | 1  | color | red  | 
| 3 | Shirt | 2  | size | M  | 
| 4 | Shirt | 2  | color | red  | 
| 5 | Shirt | 3  | size | L  | 
| 6 | Shirt | 3  | color | red  | 
| 7 | Shirt | 4  | size | M  | 
| 8 | Shirt | 4  | color | blue | 
------------------------------------------- 

が含まれているすべてのバリアントを取得したいの下の表に基づいて例えば 、コンテンツ= Mの場合は、このようなものになります

------------------------------------------- 
| ID | Product | Variant | Option | Content | 
------------------------------------------- 
| 3 | Shirt | 2  | size | M  | 
| 4 | Shirt | 2  | color | red  | 
| 7 | Shirt | 4  | size | M  | 
| 8 | Shirt | 4  | color | blue | 
------------------------------------------- 

これは意味があると思います。 ありがとう!

は、私はあなたの他の結果を取得したい場合は、単に 'M''red'を変更フィドル http://sqlfiddle.com/#!9/63e64e/2

+0

大きな質問はsqlfiddle.com +1となります。 –

答えて

1

に「赤」の文字列を設定した場合、自己結合を使用して、結果に表示されますMとイエローのバリエーションを持っているあなたのsqlfiddleに気づきました

SELECT v1.* 
FROM variant AS v1 
JOIN variant AS v2 ON v1.variant = v2.variant 
WHERE v2.content = 'red' 

これはTin Tranのクエリと機能的には同じですが、サブクエリを書く必要はありませんので、少し簡単です。 EXPLAINの出力をチェックして、それらが同じように処理されるようにする必要があります。

+0

ありがとうございます、魅力的に働いてくれてありがとう、私はここで2番目のフィルタを構築することができます:http://sqlfiddle.com/#!9/be3bbe/6次のクエリを使用してSELECT v1。* FROM variant AS v1 JOIN variant AS v2 ON v1.variant = v2.variantどこv2。content = 'S' JOIN変種AS v3 ON v1.variant = v3.variant WHERE v3.content = 'winter' – Rafanake

+0

すべての 'JOIN'句が最初に来て、次に条件の間に' AND'を持つ単一の 'WHERE'句。 – Barmar

+0

あなたはおそらく 'SELECT v1。* FROM variant AS v1 JOIN変種AS v2 ON v1.variant = v2.variant WHERE v2.content = 'S'またはv2.content = 'winter''を実行したいと思っています –

1
SELECT v.id,v.product,v.variant,v.option,v.content 
FROM variant v 
INNER JOIN (SELECT variant FROM variant WHERE content = 'red')v2 
ON v.variant = v2.variant 
ORDER BY ID ASC 

を作りました。

http://sqlfiddle.com/#!9/63e64e/7

私はそれはあなたが「M」

+0

ありがとう、それは私を大いに助けました! – Rafanake

1
SELECT * 
FROM variant 
WHERE 
variant.variant 
IN 
(
    SELECT variant.variant 
    FROM variant 
    WHERE variant.content = 'red' 
) 

これは比較的理解しやすいはずです。利用可能なオプションを持つすべてのバリアントを最初に検索する内部クエリがあります。次に、バリアント検索から返されたすべてのバリアントのすべての値を検索する外部クエリがあります。これを書くために、よりエレガントな方法は何かのように、この例では

SELECT * 
FROM variant 
INNER JOIN 
(
    SELECT variant2.variant 
    FROM variant variant2 
    WHERE variant2.content = 'red' 
) variant2 
ON variant.variant = variant2.variant 

可能性があり、あなたはそれらの両方を区別するために名前を返さテーブルの少なくとも一つにしています。これは、同じテーブルの2つのインスタンスを呼び出すためです。

SELECT * 
FROM variant 
JOIN variant AS variant2 ON variant.variant = variant2.variant 
WHERE variant2.content = 'red' 

同じ結果を出力する別の例を次に示します。これとの違いは、1つのクエリでそれを実行していることです。

ここで見つけることができますから合流について学ぶための良いソース:私の好きなダイアグラムのhttps://technet.microsoft.com/en-us/library/ms191472(v=sql.105).aspx

一つをここで見つけることができジョインに:それはいくつかのトリックを欠けているhttp://www.codeproject.com/KB/database/Visual_SQL_Joins/Visual_SQL_JOINS_orig.jpgを、それが良い基本的なアイデアを与えるんジョインでできること。

+0

ありがとう、それらのリンクを確認してください! – Rafanake

+0

MySQLは 'WHERE col IN(SELECT ...)'クエリを最適化することに悪い知られているので、避けてください。 – Barmar

関連する問題