0

私はOracleデータベースで軽いWebデザインとSQLしか行っていないので、MySQLはかなり苦手です。人々が好きなすべての果物をリストした表があるとしましょう。

name   fruit
------------
john   bananas
john   oranges
marcy  bananas
dave   oranges
lucy   bananas
lucy   oranges

オレンジが好きな人の名前をすべて取得したいとしますが、バナナが好きかどうかは指定しませんでした。この表には2つの果物しかありません。(さらに拡張される可能性がありますが、通常は2つしかありません)。

クエリは何になりますか?マーシーはバナナが好きだと指定しているだけなので、「デイブ」だけを返すクエリが必要です。ジョンとルーシーは両方が好きだと言っています。これは1つのテーブルしかないため、結合は必要ないと思います。

私はしようとしています

select name from table
where(--uhm.. use the stuff below somehow
select name from table
where fruit like 'bananas';
select name from table
where fruit like 'oranges';
)

また、オレンジは好きだがバナナは好きではない、またはバナナは好きだがオレンジは好きではないすべての人を返すクエリに本当に満足しています。どのクエリが簡単かわかりません。

また、インターネット上で同じ問題を抱えている他の誰かを見つけることができると確信しています。私の質問に答えるためにグーグルでどのクエリを使用しますか?

4

2 に答える 2

4

私はこれがトリックをするべきだと思います:

SELECT DISTINCT name 
  FROM fruits
 WHERE fruit = 'likedFruit'
   AND name NOT IN (
     SELECT name 
       FROM fruits
      WHERE fruit = 'hatedFruit');

このクエリは、次の内部から読み取る方が適切です。

  • 最初に(NOT INネストされたクエリを使用して)特定の果物が好きではない人の名前をすべて収集します(「果物嫌い」と呼びましょう)。
  • 次に、各行について、この行にいくつかの良い果物に関するデータが格納されているかどうか、および格納されている場合は、この行のname属性がこれらの厄介な「果物嫌い」の1つではないかどうかを確認します。

1つの行に誰かのお気に入りの果物に関するすべての情報が含まれているわけではないため、ネストされたクエリを使用するか、ここで結合する必要があります。そして、実際にDISTINCTは、この特定のケースでは必要ありませんが、(name, fruit)組み合わせが必要ない場合は便利ですUNIQUE

これがSQLフィドルです。そして、同じ結果を達成するためのいくつかの方法を(パフォーマンスに関して)比較する非常に役立つ記事があります。

于 2012-11-06T16:44:23.063 に答える
0

次のクエリを試すこともできます。

SELECT Name FROM(SELECT Name、GROUP_CONCAT(Fruit)as Fruits FROM Table GROUP BY Name)t1 where Fruits not like'%HatedFruit%';

于 2012-11-06T17:33:43.087 に答える