来自多个表的最大值

7 mysql

考虑以下情况:我们有 T1、T2 和 T3 表,其中保存了产品idprice产品。现在我们需要找到所有 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)

是否可以优化此查询?

Jon*_*ler 4

我假设您的意思是您想要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 之一。