MySQL多个SELECT查询在同一个表上使用不同的WHERE子句

时间:2016-05-06 18:20:34

标签: mysql select join union

我需要一些关于我正在尝试构建的MySQL查询的帮助。

这是我的表:

+----+-----------+---------+-----------+---------+------------+-----------+
| 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查询,如下所示:

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    |
+----+-----------+---------+-----------+---------+------------+-----------+

为了使所有这一切都有意义,我需要在三个条件下首先SELECT限制Apple的所有结果。然后,我需要使用第二个SELECT获取Apple的所有结果,但这次仅限制两个条件并排除第一个SELECT的结果,依此类推。

知道怎么做到这一点?我尝试了几个不同的查询,包括UNION,但不知何故无法显示我需要的结果。

2 个答案:

答案 0 :(得分:2)

使用select union而不是

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";

答案 1 :(得分:0)

我错过了什么或OR还不够吗?

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")
;

可以重构为......

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,城市组合的标准也可以缩小。

此外,UNION应该对您有用,并且可能更快,因为在使用OR时,MySQL几乎完全忽略了索引。

编辑: 你可以得到第一个"在上述查询中有六个ORDER BYLIMIT 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

...由于单个查询没有顺序,如果第一个条件产生的结果超过六个,则返回的六个可能会有所不同,但是将来自第一个查询/条件(当然,MySQL没有'实际上保证查询将在连续执行时以相同的顺序返回结果。)