我在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/

10-14 13:36
查看更多