【问题标题】:Obtaining a max row using EXISTS with additional condition/s使用带有附加条件的 EXISTS 获取最大行数
【发布时间】: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 中的子查询会好得多。

【问题讨论】:

    标签: mysql sql exists


    【解决方案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 子句在其中不起作用子选择语句(为简单起见,我没有发布实际场景)。
    猜你喜欢
    • 2014-06-11
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    • 2014-03-13
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多