2016-05-06 19 views
0

ビルドしようとしているMySQLクエリで助けが必要です。MySQL複数のSELECTクエリが同じテーブルに異なるWHERE句を持つ

ザ・は私が持っているテーブルです。

+----+-----------+---------+-----------+---------+------------+-----------+ 
| id | fruit | color | shape | country | vit  | city | 
+----+-----------+---------+-----------+---------+------------+-----------+ 
| id | Apple | red  | spherical | UK  |  A  | London | 
| id | Orange | orange | circular | USA  |  C  | New York | 
| id | Apple | green | multiple | Mexico |  C  | Cancun | 
| id | Apple | red  | spherical | Canada |  B  | Ottawa | 
+----+-----------+---------+-----------+---------+------------+-----------+ 

今、私はそうのような複数のSELECTのクエリを実行するために、1つのクエリを使用したい:

SELECT * from tbl_fruits WHERE fruit = "Apple" AND vit = "A" AND city = "London"; 
SELECT * from tbl_fruits WHERE fruit = "Apple" AND vit = "B" AND city != "London; 
SELECT * from tbl_fruits WHERE fruit = "Apple" AND vit != "A" AND vit != "B" AND city != "London"; 

結果のテーブルは次のようになります。

+----+-----------+---------+-----------+---------+------------+-----------+ 
| id | fruit | color | shape | country | vit  | city | 
+----+-----------+---------+-----------+---------+------------+-----------+ 
| id | Apple | red  | spherical | UK  |  A  | London | 
| id | Apple | green | multiple | Mexico |  C  | Cancun | 
| id | Apple | red  | spherical | Canada |  B  | Ottawa | 
+----+-----------+---------+-----------+---------+------------+-----------+ 

なぜこのようなことをするには、Aのすべての結果を得る必要がありますまず最初にSELECTを3つの条件に限定してppleします。次に、すべての結果をAppleの2番目のSELECTで取得する必要がありますが、今回は2つの条件のみを限定し、最初の結果を除外します。SELECTなど。

どのようにこれを達成するためのアイデアですか?私はUNIONを含むいくつかの異なるクエリを試しましたが、何とか私は必要な結果を表示することができません。

答えて

2

使用する]を選択組合と

SELECT * from tbl_fruits WHERE fruit = "Apple" AND vit = "A" AND city = "London" 
union 
SELECT * from tbl_fruits WHERE fruit = "Apple" AND vit = "B" AND city != "London 
union 
SELECT * from tbl_fruits WHERE fruit = "Apple" AND vit NOT IN ("A" , "B") AND city != "London"; 
+0

優秀な、とてもシンプルな...私はもっと複雑なものを試していた...ありがとう! – user3132858

0

に、私は何かが欠けアムないかOR十分ではありませんか?

...

SELECT * 
FROM tbl_fruits 
WHERE fruit = "Apple" 
    AND ( (vit = "A" AND city = "London") 
     OR (vit = "B" AND city != "London) 
     OR (vit != "A" AND vit != "B" AND city != "London") 
     ) 
; 

...にすべてのそれらのVIT上の基準は、都市の組み合わせが同様に凝縮することができますかなり確信してリファクタリングすることができ

SELECT * FROM tbl_fruits WHERE (fruit = "Apple" AND vit = "A" AND city = "London") OR (fruit = "Apple" AND vit = "B" AND city != "London) OR (fruit = "Apple" AND vit != "A" AND vit != "B" AND city != "London") ; 

。また

UNIONはあなたのために働いているはず、とMySQLがORを使用した場合、ほぼ完全にインデックスを無視する傾向があるので、速いかもしれません。


編集: あなたはこのような上記のいずれかのクエリの「最初の」ORDER BYと6とLIMIT 6得ることができます。個々のクエリは何のためだったないので...

ORDER BY (fruit = "Apple" AND vit = "A" AND city = "London") DESC 
    , (fruit = "Apple" AND vit = "B" AND city != "London) DESC 
    , (fruit = "Apple" AND vit != "A" AND vit != "B" AND city != "London") DESC 
LIMIT 6 

を、最初の条件が6つ以上の結果を返す場合、返される6つは異なる可能性がありますが、最初のクエリ/条件から来ることになります(もちろん、MySQLは実際には連続した実行で同じ順序で結果を返します。)

+0

結果とそのカウントが気にならなかったら、 'OR'が働いていたでしょう。しかし、私は最終結果を6に制限し、最初の選択を満足するものを取得し、次に2番目を満足するものを取得するなど、合計が6になるようにする必要があります。しかし、ありがとうございました! – user3132858

+0

ああ、私は見る、@ user3132858編集をチェックアウトします。 – Uueerdo

関連する問題