【问题标题】:How to SELECT MAX(column) as max_value FROM my_table WHERE some_other_column = "something" in SQL如何在 SQL 中从 my_table WHERE some_other_column = "something" 中选择 MAX(column) 作为 max_value
【发布时间】:2019-04-04 14:41:21
【问题描述】:

下面是我的 SQL 表。我正在尝试获取time 的最大值,其中to_addressdfhuih

我试过了:

SELECT MAX(time) as max_time FROM transactions WHERE to_address='dfhuih'

但是,无论to_address 是什么,该查询的结果都给出了表中的最大time 值——使用PHP mysqli 时。

在指定to_addresstime 列中选择最大值的正确方法是什么?

transactions
 ---------------------------------------
| to_address |     time     |  amount  |
----------------------------------------
|  dfhuih    | 1536294884   |  0.320   |
|  dfhuih    | 1536343222   |  0.564   |
|  adslsd    | 1546294884   |  0.320   |
|  vshjfof   | 1536294884   |  0.320   |
----------------------------------------

我的应用程序中的完整代码是

$stmt1 = $db_connection->prepare("SELECT MAX(time) as max_time FROM transactions WHERE to_address=? AND from_address=? AND is_affiliate_payment=0");
$stmt1->bind_param('is', $user_id, $faucet_key);
$stmt1->execute();
$result1 =$stmt1->get_result();

while($row = $result1->fetch_assoc())
{
   echo $row['max_time']    
}

【问题讨论】:

  • 我认为您的想法是正确的,但是您的查询中缺少一些内容,应该是:SELECT MAX(time) as max_time FROM transactions WHERE to_address = 'dfhuih',注意添加了FROM transactions
  • 这在 phpmyadmin 中有效,但在使用 PDO 时无效 - 当使用 PDO 时,无论 to_address 如何,它都会给我最大值
  • 我认为这是“不可能的”,你一定是做错了什么。 PDO 不会更改您的查询或结果。
  • 在 PDO 中,语句将 bindParam() 作为方法,而不是 bind_param()。怎么回事?
  • 我发布了一个答案可能会有所帮助,但为了更好的答案,我建议阅读 Why should I provide an MCVE for what seems to me to be a very simple SQL query? 以提供示例数据和预期结果。然后我们都可以停止做受过教育的人

标签: mysql


【解决方案1】:

问题出在这两行:

$stmt1 = $db_connection->prepare("SELECT MAX(time) as max_time 
                                  FROM transactions 
                                  WHERE to_address = ? AND 
                                        from_address = ? AND 
                                        is_affiliate_payment = 0");
$stmt1->bind_param('is', $user_id, $faucet_key);

您的查询中有两个?。第一个是to_address,第二个是from_address。两者都是字符串。然而,在您的bind_param() 中,您要求一个整数to_address。所以代码应该是:

$stmt1 = $db_connection->prepare("SELECT MAX(time) as max_time 
                                  FROM transactions 
                                  WHERE to_address = ? AND 
                                        from_address = ? AND 
                                        is_affiliate_payment = 0");
$stmt1->bind_param('ss', $to_address, $from_address);

请注意,我还更改了其余参数。不知何故$user_id, $faucet_key 似乎不正确。检查一下!

【讨论】:

    【解决方案2】:

    我相信您正在寻找,但很难说没有示例数据和预期结果的使用。

    SELECT 
     transactions.*
    FROM (
     SELECT 
       MAX(time) AS max_time
     FROM 
      transactions
     WHERE
       to_address = 'dfhuih'
    ) AS transactions_filter
    INNER JOIN 
     transactions  
    ON
       transactions_filter.max_time = transactions.time   
     AND  
       transactions.to_address = 'dfhuih'
    

    请记住,如果两个 MAX 时间值相同,它也会显示平局

    在 MySQL 8 中,您还可以将该查询重写为下面的查询。
    请注意,列别名作为列名移动到派生表别名。

    SELECT 
     transactions.*
    FROM (
     SELECT 
       MAX(time)
     FROM 
      transactions
     WHERE
       to_address = 'dfhuih'
    ) AS transactions_filter(max_time) # <- here is the column alias also defined.
    INNER JOIN 
     transactions  
    ON
       transactions_filter.max_time = transactions.time   
     AND  
       transactions.to_address = 'dfhuih'
    

    【讨论】:

    • “我会在某处添加一个 LIMIT 1 来解决这个问题吗?” 没有@OscarChambers,你必须使用 MySQL 的 8 ROW_NUMBER() 或使用 MySQL 用户变量来模拟它。 . 并过滤排名。
    • 您能解释一下为什么需要这么复杂的查询吗?
    • “你能解释一下为什么需要这么复杂的查询吗?” 是的,我可以,但是 topicstarter 接缝不需要基于最大时间值的完整记录数据接缝.. 简单的解释是您需要使用JOIN,因为如果不使用GROUP BY,就不能将聚合列与非聚合列混合在一起。例如,SELECT MAX(time), amount as max_time FROM transactions WHERE to_address=? AND from_address=? AND is_affiliate_payment=0 将是无效的 SQL 查询。跨度>
    • 我的声明“因为你不能在不使用 GROUP BY 的情况下将聚合列与非聚合列混合” 在 MySQL 的 GROUP BY 文档 @KIKOSoftware 中也提到了这里
    • @RaymondNijland 感谢您的反应。我明白你的意思。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-29
    • 1970-01-01
    • 2015-12-25
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多