首页 > 解决方案 > 根据另一个表的映射值来获取列的最小值的最有效查询

问题描述

这是一个例子

carsOwned
name|car
1   |acura
1   |honda
1   |mercedes
2   |honda
2   |mercedes
3   |acura
4   |mercedes
carValue
car     | value
honda   | 1
acura   | 2
mercedes| 3
Output
name | min
1    |honda
2    |honda
3    |acura
4    |mercedes

在输出中,每个名称都显示他们拥有的最便宜的汽车(值显示在表 carValue 中)。不确定如何以最有效的方式执行此操作。

标签: mysqlsql

解决方案


我知道,对于 中的每个namecarOwned您都想选择 中值最低的汽车carValue

这可以通过连接两个表并添加一个NOT EXISTS条件来解决,以确保只保留具有最小可能值的记录:

SELECT o.*
FROM carsOwned o
INNER JOIN carValue v ON v.car = o.car
WHERE NOT EXISTS (
    SELECT 1
    FROM carsOwned o1
    INNER JOIN carValue v1 ON v1.car = o1.car
    WHERE o1.name = o.name AND v1.value < v.value
);

或者在 MySQL 8.0 中,您可以使用ROW_NUMBER()

SELECT name, car
FROM (
    SELECT o.*, ROW_NUMBER() OVER(PARTITION BY o.name ORDER BY v.value) rn
    FROM carsOwned o
    INNER JOIN carValue v ON v.car = o.car
) x
WHERE rn = 1

DB Fiddle 上的演示

| name | car      |
| ---- | -------- |
| 1    | honda    |
| 2    | honda    |
| 3    | acura    |
| 4    | mercedes |

推荐阅读