在Mysql 5.5数据库中,我有一个表。 最初,我只需要最高金额的第一张唱片。
bid
----------------------
id int
personId int
itemId int
amount double
tieBreak boolean
updatedDate datetime
DATA:
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,即使第二次出价第一次,也会以抢七0击败10。
答案 0 :(得分:1)
您的条件列表适用于order by
子句。唉,你不能在MySQL中轻松选择项目的第一项。
但是,有一个技巧 - 假设id
唯一地标识每一行(如果这样的列名称没有该属性,那么就会感到羞耻)。您可以group_concat()
使用order by
按条件排序id
。然后,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;