mysql - 根据另一个表的映射值来获取列的最小值的最有效查询
问题描述
这是一个例子
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 中)。不确定如何以最有效的方式执行此操作。
解决方案
我知道,对于 中的每个name
,carOwned
您都想选择 中值最低的汽车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
| name | car |
| ---- | -------- |
| 1 | honda |
| 2 | honda |
| 3 | acura |
| 4 | mercedes |
推荐阅读
- python - 从其他 DataFrame 的对角线创建 DataFrame
- php - 为什么 CORS 在某些地方有效,而在其他地方无效?
- php - 为什么 Symfony 表单不使用约束注释验证我的 DTO?
- javascript - 如何将值保存到函数的变量中?
- php - 使用开发依赖项在 Heroku 上部署时,尝试从命名空间“Symfony\Bundle\WebProfilerBundle”加载类“WebProfilerBundle”
- c# - 如何在数独上洗牌
- c# - 添加城市的数组列表应用程序
- python - Crontab 无法执行 python 脚本并出现错误:“[Errno 1] Operation not allowed”
- java - 线程上的调用中断非常慢
- mysql - 通讯链路故障——MySQL+JDBC