我在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
表中从语言上获得最大行,其中weight
列的值介于0和60之间(例如)。我想要使用
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
),则返回表中所有行的最大行,但不是所希望的。应在应用a之后返回一个最大行)根据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
中的子查询,那就更好了。 最佳答案
一般来说,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
关于mysql - 使用具有附加条件的EXISTS获得最大行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24778237/