使用带有附加条件的 EXISTS 获取最大行数
Posted
技术标签:
【中文标题】使用带有附加条件的 EXISTS 获取最大行数【英文标题】:Obtaining a max row using EXISTS with additional condition/s 【发布时间】:2014-07-16 10:16:16 【问题描述】:我在 mysql 数据库中有一个表,即weight
。可以在下面的快照中查看。
weight 表:
:
我需要以下查询。
SELECT *
FROM weight w
WHERE w.weight_id IN (SELECT MAX(ww.weight_id)
FROM weight ww
WHERE ww.weight BETWEEN 0 AND 60);
从weight
列的值介于0 到60 之间的行中(例如)从weight
表中获取最大行。
我想要使用EXISTS()
进行相同的查询。以下尝试不成功。
SELECT *
FROM weight w
WHERE NOT EXISTS (SELECT 1
FROM weight ww
WHERE w.weight_id < ww.weight_id
AND ww.weight BETWEEN 0 AND 60);
它返回从最大行开始的所有行(如果BETWEEN
条件(AND ww.weight BETWEEN 0 AND 60
)被省略,它会从表中的所有行中返回一个最大值,但这是不受欢迎的。它应该返回一个最大行根据BETWEEN
条件应用过滤器后)。
稍作修改的版本不返回任何行。
SELECT *
FROM weight w
WHERE EXISTS (SELECT 1
FROM weight ww
WHERE w.weight_id = ww.weight_id
AND ww.weight BETWEEN 0 AND 60
AND NOT EXISTS(SELECT 1
FROM weight www
WHERE ww.weight_id < www.weight_id))
我还有其他方法可以使用EXISTS()
吗?
我正在使用一个 ORM 框架,其中 FROM
子句不支持子查询。因此,如果排除FROM
中的子查询会好得多。
【问题讨论】:
【参考方案1】:一般而言,id
应仅用作行标识符,而不应使用 MAX()
进行比较。
如果您想要在两个值之间具有最大 weight
的一行:
SELECT id, weight
FROM weight
WHERE weight BETWEEN 0 AND 60
ORDER BY weight DESC
LIMIT 1
在这种情况下我不会使用EXISTS
。
更新
如果你不能使用LIMIT
那么:
SELECT id, weight
FROM weight
WHERE weight = (
SELECT MAX(wi.weight)
FROM weight wi
WHERE wi.weight BETWEEN 0 AND 60
)
如果MAX(weight)
上没有欺骗,将返回相同的结果
如果你坚持使用EXISTS
,那么你可以试试:
SELECT *
FROM weight w
WHERE NOT EXISTS (
SELECT 1
FROM weight ww
WHERE w.weight < ww.weight
AND ww.weight BETWEEN 0 AND 60
)
AND w.weight BETWEEN 0 AND 60
【讨论】:
问题中的这个查询反过来,将与其他相关表中的其他查询一起包装(更多EXISTS()
并且可能是连接),其中 LIMIT
子句在其中不起作用子选择语句(为简单起见,我没有发布实际场景)。以上是关于使用带有附加条件的 EXISTS 获取最大行数的主要内容,如果未能解决你的问题,请参考以下文章