0

在 Mysql 5.5 数据库中,我有一个表。最初,我只需要最高金额的第一条记录。

bid
----------------------
id           int
personId     int
itemId       int
amount       double
tieBreak     boolean
updatedDate  datetime

数据:

id       personId        itemId       amount     tiebreak     updatedDate
----------------------------------------------------------------------------------
1           4             111          100          1         2013-08-26 09:00:00
2           5             111          100          0         2013-08-26 10:00:00
3           6             111          100          1         2013-08-26 11:00:00
...
4           24            222          200          0         2013-08-27 09:00:00
5           57            222          200          0         2013-08-27 10:00:00
6           12            222          200          0         2013-08-27 11:00:00
...
7           2             333          400          1         2013-08-27 11:00:00
8           7             333          300          1         2013-08-27 11:00:00
9           25            333          600          1         2013-08-27 11:00:00

我需要表中每个 itemId 的最旧条目的完整记录,其中数量等于该项目的最大数量,并且 tieBreak true (1) 的项目优先于 tiebreak false (0) 的项目。

id       personId        itemId       amount     tiebreak     updatedDate
----------------------------------------------------------------------------------
1           4             111          100          1         2013-08-26 09:00:00
4           24            222          200          0         2013-08-27 09:00:00
9           25            333          600          1         2013-08-27 11:00:00

1 因为它是最旧的记录,其中 tiebreak = 1 和最高金额 4 因为它是最旧的记录,其他一切都相等 9 因为它的最高金额

我得到的最接近的是:

SELECT a.*
FROM bid a
LEFT OUTER JOIN bid a2 ON (a.itemId = a2.itemId AND a.amount < a2.amount)
WHERE a2.id IS NULL
ORDER BY tiebreak DESC, updatedDate ASC;

哪种方法有效,但会撤回与排序的最高金额匹配的所有出价...我只想要每个项目的最高金额和最高价值(1 或 0)的单个最旧出价。意思是 10 的数量与 tiebreak 1 击败了 10 的数量与 tiebreak 0 即使第二个出价首先出现。

4

1 回答 1

1

您的条件列表是order by子句的理想选择。唉,你不能在 MySQL 中轻易地为一个项目选择第一个项目。

但是,有一个技巧 - 假设id唯一标识每一行(如果这样的列名没有该属性,你会感到羞耻)。您可以使用group_concat()with按条件order byids 进行排序。然后,substring_index()可以拿到第一个。瞧!几乎就像支持 MySQL 一样row_number()(执行所有这些的 ANSI 标准方式)。

这是查询的样子:

select bid.*
from (select itemid,
             substring_index(group_concat(id order by amount desc, updateddate asc, tiebreak desc), ',', 1) as id
      from bid
      group by itemid
     ) b join
     bid
     on b.itemid = bid.itemid and b.id = bid.id;
于 2013-08-28T01:14:38.357 回答