2

現在、いくつかのデータをテーブルにプルしようとしていますが、特定の行が列に最も多く含まれている場合にのみ、特定の行を表示したいと思います。

+----+--------+---------+---------+----------+-----+
| id | auc_id | user_id | bamount |   date   | out | 
+----+--------+---------+---------+----------+-----+
| 20 | 10002  |  10008  |    12   |1342445619|   1 |
| 21 | 10002  |  10009  |    14   |1342445667|   1 |
| 22 | 10002  |  10008  |    16   |1342445669|   0 |
+----+--------+---------+---------+----------+-----+

各auc_idの各user_idの最新の行を表に表示したいと思います

したがって、auc_id 10002ユーザー10008のユーザーは、テーブルに16のbamountのみを表示し、12は16より小さいため、12行のbamountを無視します。

これは可能ですか?

4

3 に答える 3

2

はい、各ユーザーの最高入札額に対応する行を表示することは可能です。

@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つもないことがわかっていて、ユーザーが複数の入札単価を設定している場合に適切なオークションを行う必要がない場合は、日付フィールド。しかし、私の経験では、実際の生活では物事が台無しになるため、データに関する仮定(入札単価が常に上昇するなど)に依存することは避けたほうがよいでしょう。

于 2012-07-26T17:37:10.877 に答える
0

MAX関数を使用して、最高のバマウントを取得します

 SELECT user_id, MAX(bamount) FROM table_name GROUP BY user_id
于 2012-07-26T17:30:13.550 に答える
0
select * from table1 t
where auction_date = (select max(auction_date) from table1 where 
                          user_id = a.user_id and auc_id = a.auc_id)

インデックスの順序は、Auction_date、user_id、auc_idです。Aution_dateは、インデックスの列である必要があります。

于 2012-07-26T17:45:11.083 に答える