はい、各ユーザーの最高入札額に対応する行を表示することは可能です。
@BryanMoylesが提案したことから始めます。ユーザーごとに入札単価を要約します。
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
これはほぼ正しいです。ただし、2つの異なるオークションでまったく同じ金額を入札したユーザーがいる場合は、そのユーザーに対して2つの行が表示されます。あなたの質問は、この特定のエッジケースで何をする必要があるかを指定していませんでした。
これはどう?2つの入札額が同じである場合に、ユーザーに最新の(つまり、数値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
これで、そのクエリを生のテーブルに結合します。これで完了です。この全体的なクエリでは、適切なORDERBY句を使用することを忘れないでください。
これは、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番号を見つける要約にネストされています。次に、生のテーブルから必要な行を選択するために使用されます。
あなたがあなたの質問で与えたよりもあなたのデータのより良い理解を利用することによってこれをやってのけるより簡単な方法があるかもしれません。たとえば、入札単価が常に上昇し、同じ日付の入札単価が2つもないことがわかっていて、ユーザーが複数の入札単価を設定している場合に適切なオークションを行う必要がない場合は、日付フィールド。しかし、私の経験では、実際の生活では物事が台無しになるため、データに関する仮定(入札単価が常に上昇するなど)に依存することは避けたほうがよいでしょう。