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 は、タイブレーク = 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) の各アイテムの最も古い入札のみが必要です。つまり、2 番目のビッドが最初に来たとしても、タイブレーク 1 での 10 の額は、タイブレーク 0 での 10 の額を打ち負かします。

4

1 に答える 1

1

条件のリストは、order by句に最適です。残念ながら、MySQL では項目の最初の項目を簡単に選択することはできません。

ただし、トリックがあります-id各行を一意に識別すると仮定します(そのような列名にそのプロパティがない場合は残念です)。group_concat()withを使用して、条件によって sorder 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;
于 2013-08-28T01:14:38.357 に答える