2013-08-28 138 views
0

在Mysql 5.5數據庫中,我有一個表。 最初,我只需要最高金額的第一筆記錄。SQL獲取第一個創建的最高金額的行

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的表,其中量等於最大金額爲項目和項目進行搶七真(1)獲得優先最早的條目全部記錄over 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,因爲它與搶七= 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; 

哪種作品,但拉回到所有投標匹配最高金額排序...... 我只希望爲每個項目,其中的最高金額和單最古老的投標tiebreak最高值(1或0)。意味着即使第二個出價排在第一位,tiebreak 1的金額爲10也會以tiebreak 0超過10。

+0

樣本數據和所需輸出行的一個例子將有助於更好地理解它。 – mshsayem

回答

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; 
+0

這隻給我一個記錄。我希望表中的每個itemId都有一個。 – kasdega

+0

@kasdega。 。 。現在已經修復了。 –

+0

迄今爲止進行的極少測試,但這似乎工作......謝謝! – kasdega