質問: s2.id order by datetime いや。すべての記録を渡します。-- 3 ..something exotic: 様々な結果で。
回答: 内部クエリやgroup byがない、最速のmysqlソリューション:select m.* -- get the row that contains the max value from topten m -- "m" from "max" left join topten b -- "b" from "bigger" on m.home = b.home -- match "max" row with "bigger" row by `home` and m.datetime < b.datetime -- want "bigger" than "max" where b.datetime is null -- keep only if there is no bigger than max 説明 :home列を使用して、テーブルとそれ自体を結合します。 left joinを使用すると、テーブルmからのすべての行が結果セットに表示されます。テーブルbと一致しないものは、nullの列に対してbsを持ちます。joinのもう1つの条件は、bの行よりもdatetime列の値が大きいmの行のみに一致するように要求します。質問に投稿されたデータを使用して、left joinはこのペアを生成します。+------------------------------------------+--------------------------------+ | the row from `m` | the matching row from `b` | |------------------------------------------|--------------------------------| | id home datetime player resource | id home datetime ... | |----|-----|------------|--------|---------|------|------|------------|-----| | 1 | 10 | 04/03/2009 | john | 399 | null | null | null | ... | * | 2 | 11 | 04/03/2009 | juliet | 244 | null | null | null | ... | * | 5 | 12 | 04/03/2009 | borat | 555 | null | null | null | ... | * | 3 | 10 | 03/03/2009 | john | 300 | 1 | 10 | 04/03/2009 | ... | | 4 | 11 | 03/03/2009 | juliet | 200 | 2 | 11 | 04/03/2009 | ... | | 6 | 12 | 03/03/2009 | borat | 500 | 5 | 12 | 04/03/2009 | ... | | 7 | 13 | 24/12/2008 | borat | 600 | 8 | 13 | 01/01/2009 | ... | | 8 | 13 | 01/01/2009 | borat | 700 | null | null | null | ... | * +------------------------------------------+--------------------------------+ 最後に、where句は、nullの列にbがあるペアのみを保持します(上の表では、それらは*でマークされています)。これは、join句の2番目の条件により、mから選択された行の列datetimeの最大値が得られることを意味します。 sqlアンチパターン:データベースプログラミングの落とし穴の回避 を読んで他のsqlのヒントを読んでください。