MySQL 多个 SELECT 查询在同一个 table 上使用不同的 WHERE 子句
MySQL Multiple SELECT queries with different WHERE clause on the same table
我需要一些关于我正在尝试构建的 MySQL 查询的帮助。
这是 table 我有:
+----+-----------+---------+-----------+---------+------------+-----------+
| 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";
结果 table 将是:
+----+-----------+---------+-----------+---------+------------+-----------+
| 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 |
+----+-----------+---------+-----------+---------+------------+-----------+
为了让所有这些都明白为什么,我需要获得 Apple 的所有结果,第一个 SELECT
限制三个条件。然后,我需要使用第二个 SELECT
获取 Apple 的所有结果,但这次仅限于两个条件,并排除第一个 SELECT
的结果,依此类推。
知道如何实现吗?我尝试了几个不同的查询,包括 UNION
但不知何故无法显示我需要的结果。
使用select并集而不是
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";
我是不是遗漏了什么或者 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
应该对您有用,而且可能更快,因为 MySQL 在使用 OR
时几乎完全忽略索引。
编辑:
您可以在上述任一查询中使用 ORDER BY
和 LIMIT 6
获得 "first" 六个,例如:
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
...由于各个查询没有顺序,如果第一个条件产生超过六个结果,则六个 returned 可能不同,但将来自第一个 query/condition(当然,MySQL 实际上并不能保证查询 return 结果在连续执行时的顺序相同 。)
我需要一些关于我正在尝试构建的 MySQL 查询的帮助。
这是 table 我有:
+----+-----------+---------+-----------+---------+------------+-----------+
| 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";
结果 table 将是:
+----+-----------+---------+-----------+---------+------------+-----------+
| 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 |
+----+-----------+---------+-----------+---------+------------+-----------+
为了让所有这些都明白为什么,我需要获得 Apple 的所有结果,第一个 SELECT
限制三个条件。然后,我需要使用第二个 SELECT
获取 Apple 的所有结果,但这次仅限于两个条件,并排除第一个 SELECT
的结果,依此类推。
知道如何实现吗?我尝试了几个不同的查询,包括 UNION
但不知何故无法显示我需要的结果。
使用select并集而不是
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";
我是不是遗漏了什么或者 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
应该对您有用,而且可能更快,因为 MySQL 在使用 OR
时几乎完全忽略索引。
编辑:
您可以在上述任一查询中使用 ORDER BY
和 LIMIT 6
获得 "first" 六个,例如:
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
...由于各个查询没有顺序,如果第一个条件产生超过六个结果,则六个 returned 可能不同,但将来自第一个 query/condition(当然,MySQL 实际上并不能保证查询 return 结果在连续执行时的顺序相同 。)