繁体   English   中英

使用具有附加条件的EXISTS获得最大行

[英]Obtaining a max row using EXISTS with additional condition/s

我在MySQL数据库中有一个表,即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 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 ),那么它将返回表中所有行的最大值,但它不是所希望的。它应该返回一个最大行根据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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM