7 mysql
考虑以下情况:我们有 T1、T2 和 T3 表,其中保存了产品id
和price
产品。现在我们需要找到所有 3 个表中id
最多price
的产品。我有这个解决方案:
select id
from T1
where price in(
select max(price)
from(
select max(price) as price
from T1
union
select max(price) as price
from T2
union
select max(price) as price
from T3
) temp
)
union
select id
from T2
where price in(
select max(price)
from(
select max(price) as price
from T1
union
select max(price) as price
from T2
union
select max(price) as price
from T3
) temp
)
union
.... same for T3 table.
Run Code Online (Sandbox Code Playgroud)
是否可以优化此查询?
我假设您的意思是您想要id
根据所有三个表中的数据最昂贵的商品。对于每个表,您需要id
该表中最高价格的商品的价格。对于一张表来说,即:
SELECT id, price FROM Tn WHERE price = (SELECT MAX(price) FROM Tn)
Run Code Online (Sandbox Code Playgroud)
所以,有一个子查询:
SELECT id, price FROM T1 WHERE price = (SELECT MAX(price) FROM T1)
UNION
SELECT id, price FROM T2 WHERE price = (SELECT MAX(price) FROM T2)
UNION
SELECT id, price FROM T3 WHERE price = (SELECT MAX(price) FROM T3)
Run Code Online (Sandbox Code Playgroud)
并且,您需要id
从该子查询中找到具有最高价格的值之一:
SELECT id
FROM (SELECT id, price FROM T1 WHERE price = (SELECT MAX(price) FROM T1)
UNION
SELECT id, price FROM T2 WHERE price = (SELECT MAX(price) FROM T2)
UNION
SELECT id, price FROM T3 WHERE price = (SELECT MAX(price) FROM T3)
) AS M
ORDER BY price DESC
LIMIT 1
Run Code Online (Sandbox Code Playgroud)
请注意,如果任一表中列出了两个同等昂贵的商品,则 UNION 查询将返回超过 3 行。如果有两个或多个同样昂贵的商品,带有 LIMIT 的查询会选择一个,并且您无法预测是哪一个。如果您需要查看id
成本最高的同等昂贵物品的所有值,那么您需要使用嵌套查询来玩类似的游戏。这让我大吃一惊,但应该有效:
SELECT id, price
FROM (SELECT id, price FROM T1 WHERE price = (SELECT MAX(price) FROM T1)
UNION
SELECT id, price FROM T2 WHERE price = (SELECT MAX(price) FROM T2)
UNION
SELECT id, price FROM T3 WHERE price = (SELECT MAX(price) FROM T3)
) AS M
WHERE price =
(SELECT MAX(Price)
FROM (SELECT id, price FROM T1 WHERE price = (SELECT MAX(price) FROM T1)
UNION
SELECT id, price FROM T2 WHERE price = (SELECT MAX(price) FROM T2)
UNION
SELECT id, price FROM T3 WHERE price = (SELECT MAX(price) FROM T3)
) AS M2
);
Run Code Online (Sandbox Code Playgroud)
使用WITH子句会更容易:
WITH MaxPrices AS
(SELECT id, price FROM T1 WHERE price = (SELECT MAX(price) FROM T1)
UNION
SELECT id, price FROM T2 WHERE price = (SELECT MAX(price) FROM T2)
UNION
SELECT id, price FROM T3 WHERE price = (SELECT MAX(price) FROM T3)
)
SELECT id, price
FROM M
WHERE price = (SELECT MAX(Price) FROM M);
Run Code Online (Sandbox Code Playgroud)
并不是每个 DBMS 都支持这样的 WITH 子句,我相信 MySQL 是不包含此类支持的 DBMS 之一。
归档时间: |
|
查看次数: |
30710 次 |
最近记录: |