使用带有附加条件的 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 获取最大行数的主要内容,如果未能解决你的问题,请参考以下文章

获取数据表中满足特定条件的行数

在 MySQL 中使用 EXISTS 进行查询的两个条件

从相关表中获取每组的最大行数

如何根据条件附加指令

带有附加参数的 Django 自定义模型方法

django+SQLite搭建轻量级个人博客QuerySet的exists()方法检查是否有数据