【问题标题】:SQL select-row-having-maximum when the maximising value is computed from the row从行计算最大值时的 SQL select-row-having-maximum
【发布时间】:2012-03-05 20:11:57
【问题描述】:

如果我想为特定列选择具有最大值的行,我可以简单地这样做

SELECT * FROM tablename WHERE columnname=(SELECT MAX(columnname) FROM tablename)

我的问题是双重的。首先,如果这个值不是列而是对行进行操作的存储过程的结果,那么语法是什么?类似的东西

SELECT * FROM tablename
WHERE CALL procname (???)
   = (SELECT MAX (CALL procname (???) FROM tablename)

如何充实这个查询?

其次,在这种幼稚的形式中,我们对每一行调用一次procname 以确定MAX(...),然后可能对每一行调用一次再次以测试每一行是否具有最大值。

我该如何优化呢?我猜它可能与临时表有关,但我不知道引擎有多聪明,我在心理上将它与只需要维护的 C 风格 for 循环的性能进行比较一次一行的值。

【问题讨论】:

    标签: sql mysql5


    【解决方案1】:

    假设您在 pkcol 中有一个数字主,并且您的计算列 colname 也是数字,您可以尝试类似

    SELECT
      @proc:=CALL procname(colname) AS dummy1,
      IF(@proc>@val,@id:=pkcol,@id) AS dummy2,
      IF(@proc>@val,@val:=@val,@val) AS dummy3
    FROM
      (@id:=0) AS initid,
      (@val:=0) AS initval,
      tablename
    ;
    
    -- discard query result
    
    SELECT * FROM tablename WHERE pkcol=@id;
    

    这将非常接近您的 C 构造。

    【讨论】:

    • 你能给我一个链接来解释@:=语法吗?我不确定我是否理解这一点......它是在原地修改表格吗?
    • @xxx 是一个会话变量 - 将其与 PHP 中的 $xxx 进行比较。 := 是赋值运算符(就像在 Pascal 中一样)。见dev.mysql.com/doc/refman/5.5/en/user-variables.html
    猜你喜欢
    • 2012-12-24
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    相关资源
    最近更新 更多