1

私は最も難しいテーブルを持っています

    One                        Two
   apple                      orange
   orange                     grapes 
   banana                     strawberry
   orange                     strawberry
   grapes                     apple

これで、ここに5つのペアがリストされていることがわかります。このテーブルでは、果物の名前(リンゴ)が1列目にある場合と、2列目にある場合があるため、通常のテーブルではありません。

And another table Description
name             color  
apple            red
orange           orange
strawberry       pink
banana           yellow
grapes           black

iamバナナと私がペアになっている果物の説明を見たくないとしましょう。 さて、誰かがmysqlで次のすべてとペアになっているが、バナナとはペアになっていない果物の詳細を表示する方法を教えてもらえます:イチゴ、ブドウ、リンゴ。

私はmysqlでサポートされていないそれを行う方法を教えています。

Select * from description 
natural join (select one as name where two='apple' union select two as name where one='apple') as t1 
natural join (select one as name where two='grapes' union select two as name where one='grapes') as t2
natural join (select one as name where two='strawberry' union select two as name where one='strawberry') as t3
MINUS
Select * from description 
natural join (select one as name where two='banana' union select two as name where one='banana') as b6
4

4 に答える 4

3
SELECT * FROM Description
NATURAL JOIN (
  SELECT One AS name FROM hardest WHERE Two = 'strawberry'
  UNION
  SELECT Two AS name FROM hardest WHERE One = 'strawberry'
) AS t1
NATURAL JOIN (
  SELECT One AS name FROM hardest WHERE Two = 'grapes'
  UNION
  SELECT Two AS name FROM hardest WHERE One = 'grapes'
) AS t2
NATURAL JOIN (
  SELECT One AS name FROM hardest WHERE Two = 'apple'
  UNION
  SELECT Two AS name FROM hardest WHERE One = 'apple'
) AS t3;

アップデート

bananaOPは質問を更新し、結果セットが;とペアになっているフルーツを除外する必要があるという制約を追加しました。次に、を使用して解決策を提案しましたWHERE name NOT IN ( SELECT ... )が、外部結合がより効率的かどうかを疑問視しました。

まず、外部結合を使用したクエリ:

SELECT Description.* FROM Description
NATURAL JOIN (
  SELECT One AS name FROM hardest WHERE Two = 'strawberry'
  UNION
  SELECT Two AS name FROM hardest WHERE One = 'strawberry'
) AS t1
NATURAL JOIN (
  SELECT One AS name FROM hardest WHERE Two = 'grapes'
  UNION
  SELECT Two AS name FROM hardest WHERE One = 'grapes'
) AS t2
NATURAL JOIN (
  SELECT One AS name FROM hardest WHERE Two = 'apple'
  UNION
  SELECT Two AS name FROM hardest WHERE One = 'apple'
) AS t3
NATURAL LEFT JOIN (
  SELECT One AS name, TRUE As hasBanana FROM hardest WHERE Two = 'banana'
  UNION
  SELECT Two AS name, TRUE As hasBanana FROM hardest WHERE One = 'banana'
) AS t4
WHERE hasBanana IS NULL;

どちらがより効率的かに関して、この記事ではさまざまなアプローチを比較します。それは述べています(に関して[NOT] IN ( SELECT ... )

LEFT JOIN基本的に、これは/が使用するプランとまったく同じですが、IS NULLこれらのプランはコードのさまざまなブランチによって実行され、の結果では異なって見えますEXPLAIN。アルゴリズムは実際には同じであり、クエリは同時に完了します。

于 2012-04-27T11:27:05.800 に答える
0

質問が元の質問から変化しているので、私は答えを片付けています。

于 2012-04-27T11:20:26.683 に答える
0

こんにちはあなたはあなた自身の質問の答えを持っています、あなたはINの代わりに使用しなければなりません=。以下のクエリを確認してください...

select * from hardest,description where 
   (one=name and two IN ('apple' , 'strawberry','grapes')) 
   or 
   (one IN ('apple','strawberry' , 'grapes') and two=name)

ありがとう

于 2012-04-27T12:34:14.550 に答える
0

iamの書き方が最も効率的であることを確認してください。他にもっと効率的な方法がある場合は、次のように書いてください。

 SELECT * FROM Description 
   NATURAL JOIN (   SELECT One AS name FROM hardest WHERE Two = 'strawberry'  
     UNION SELECT Two AS name FROM hardest WHERE One = 'strawberry' ) AS t1
   NATURAL JOIN (   SELECT One AS name FROM hardest WHERE Two = 'grapes'  
     UNION   SELECT Two AS name FROM hardest WHERE One = 'grapes' ) AS t2 
   NATURAL JOIN (   SELECT One AS name FROM hardest WHERE Two = 'apples' 
     UNION   SELECT Two AS name FROM hardest WHERE One = 'apples' ) AS t3
    where name not in ( SELECT One AS name FROM hardest WHERE Two = 'banana' 
     UNION   SELECT Two AS name FROM hardest WHERE One = 'banana') AS fz );
于 2012-04-28T12:08:31.293 に答える