序文
まずビジネス要件を理解しましょう。ブロガーは長い間バックエンドについて書いていませんでしたが、この文章は私の知識の盲点を直撃しました。簡単に復元しましょう。ここではテーブルを使用してテーブルのフィールドをシミュレートします。テーブル
の内容は次のとおりです。 . 私たちの要件は、同じ名前のデータを抽出することです。「皆さんは最初に何を考えるかわかりません。最初に思いついたのは、グループを使うことでした。当時は、グループ化というとただのグループだと思っていました。とても簡単でした。それから試してみた結果、こうなりました。」。。。。そうではないようです。。。。それから私はエラー解決の旅を始めました。。。。
諦めかけたとき、ふと我に返り、この条件についてよく考えてみたところ、名前と最新時刻をそれぞれ取り出して、名前と最新時刻から直接確認するだけではないでしょうか。時間?最新記録じゃないですか??
それでは、その方法を見てみましょう。
コード
まず、最初のステップは、各名前に対応する最新の時刻を見つけることです。
select name, max(dtime) from test group by name;
+------+---------------------+
| name | max(dtime) |
+------+---------------------+
| xw | 2023-05-22 20:01:43 |
| ll | 2023-05-26 20:01:54 |
| oo | 2023-05-03 20:01:56 |
+------+---------------------+
次に、上でクエリしたデータとテーブル内のデータを左結合するだけです。
select t2.* from (select t.name, max(t.dtime) dtime from test t group by name) t1 left join test t2 on t1.name=t2.name and t1.dtime=t2.dtime;
+----+------+---------------------+------+
| id | name | dtime | info |
+----+------+---------------------+------+
| 2 | xw | 2023-05-22 20:01:43 | 5-22 |
| 5 | ll | 2023-05-26 20:01:54 | 5-26 |
| 6 | oo | 2023-05-03 20:01:56 | 5-03 |
+----+------+---------------------+------+
3 rows in set (0.07 sec)
それなら大丈夫です
要約する
実はとても単純で、何も考えずにボーッとしていただけだったので、記録しに来ました。
ちなみに、より効率的な方法がないか専門家に質問したいのですが、もし便利であれば、コメント欄で共有してください。