【问题标题】:Showing highest amounts only仅显示最高金额
【发布时间】:2023-04-01 02:15:01
【问题描述】:

我目前正试图将一些数据提取到表中,但我只想显示某一行,如果它包含列中的最高金额。

+----+--------+---------+---------+----------+-----+
| id | auc_id | user_id | bamount |   date   | out | 
+----+--------+---------+---------+----------+-----+
| 20 | 10002  |  10008  |    12   |1342445619|   1 |
| 21 | 10002  |  10009  |    14   |1342445667|   1 |
| 22 | 10002  |  10008  |    16   |1342445669|   0 |
+----+--------+---------+---------+----------+-----+

我想在表格中显示每个 auc_id 的每个 user_id 的最新行

因此,auc_id 10002 的用户 10008 将仅在表中显示 16 的 bamount 并忽略 12 行的 bamount,因为 12 小于 16

这可能吗?

【问题讨论】:

    标签: php mysql database datatable


    【解决方案1】:

    是的,可以显示与每个用户的最高出价对应的行。

    按照@Bryan Moyles 的建议开始;按用户汇总您的出价。

     SELECT user_id, MAX(bamount) bamount
       FROM table_name
      GROUP BY user_id
    

    现在您知道每个用户的最高出价了。接下来,您需要通过将原始表连接到摘要来检索整行。

     SELECT t.id, t.auc_id, t.user_id, t.bamount, t.date, t.out
       FROM table_name t
      INNER JOIN (
         SELECT user_id, MAX(bamount) bamount
           FROM table_name
          GROUP BY user_id
      ) m ON t.user_id = m.user_id AND t.bamount = m.bamount
    

    这几乎是正确的。但是,如果您有一个用户在两次不同的拍卖中出价完全相同,您将获得该用户的两行。您的问题没有说明您需要对这个特殊的边缘情况做什么。

    这个怎么样?在两个出价金额相同的情况下,让我们为用户给出最近的(即具有最大数字 id 的那个)出价。所以,我们需要另一个摘要查询,就像这样。

     SELECT w.user_id, MAX(w.id) id
       FROM table_name w
      INNER JOIN (
         SELECT user_id, MAX(bamount) bamount
           FROM table_name
          GROUP BY user_id
      ) x ON w.user_id = x.user_id AND w.bamount = x.bamount
      GROUP BY w.user_id
    

    现在您将该查询连接到您的原始表,您瞧,您已经完成了。不要忘记在整个查询中使用适当的 ORDER BY 子句。

    这假定 id 是主键唯一列。

     SELECT t.id, t.auc_id, t.user_id, t.bamount, t.date, t.out
       FROM table_name t
      INNER JOIN (
         SELECT w.user_id, MAX(w.id) id
           FROM table_name w
          INNER JOIN (
             SELECT user_id, MAX(bamount) bamount
               FROM table_name
              GROUP BY user_id
          ) x ON w.user_id = x.user_id AND w.bamount = x.bamount
         GROUP BY w.user_id
      ) m ON t.id = m.id
    

    看看情况如何?有一个摘要可以找到用户的最大数字出价。它嵌套在一个摘要中,为每个用户找到最大的 ID 号。它反过来用于从原始表中选择您需要的行。

    利用对数据的更好理解,可能有比您在问题中给出的更简单的方法来实现这一目标。例如,如果您知道出价总是会增加,并且没有两个出价的日期相同,并且您不关心如果用户对不止一个出价进行正确的拍卖,那么您可以只用日期字段。但是,根据我的经验,最好避免依赖关于您的数据的假设(例如出价总是在增加),因为在现实生活中事情会变得很糟糕。

    【讨论】:

    • 谢谢,这是我对堆栈溢出的最佳回答!只是一个小问题 - m 在哪里。物品来自哪里?我已阅读但看不到它们的定义位置:s
    • 这是一个表别名。我做了INNER JOIN ( blah blah blah ) m
    【解决方案2】:

    使用MAX函数获取最高金额

     SELECT user_id, MAX(bamount) FROM table_name GROUP BY user_id
    

    【讨论】:

    • 关闭。您还需要 group by auc_id, user_id 以及按照 OP 的要求 I would like to show in the table the most recent row for each user_id for each auc_id
    【解决方案3】:
    select * from table1 t
    where auction_date = (select max(auction_date) from table1 where 
                              user_id = a.user_id and auc_id = a.auc_id)
    

    您的索引顺序是:Auction_date、user_id、auc_id。 Aution_date 应该是索引中的列。

    【讨论】:

      猜你喜欢
      • 2019-09-13
      • 1970-01-01
      • 2020-09-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-11
      • 2022-11-21
      • 2017-07-10
      • 2014-07-29
      相关资源
      最近更新 更多