質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

2回答

730閲覧

最新の情報を取得するSQLがうまく書けません

Ummo

総合スコア30

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2021/05/19 09:19

以下のようなデータと条件があり、取得するためのSQLを書いたのですが
結果がうまく取得できません。

1. 条件
タイプBのユーザごとに、指定日付以降で最新の更新日付(updated_at)を取得する。
※deleted_atがnullのものを取得

2. データ

article_iduser_idtypeupdated_atdeleted_at
11A2021-05-01
21B2021-05-02
32A2021-05-01
41B2021-05-03
52B2021-05-01
63B2021-05-02
73B2021-05-042021-05-04
81B2021-05-06

 
3. とれてほしい結果
※指定日付は2021-05-05とした場合

article_iduser_idtypeupdated_atdeleted_at
41B2021-05-03 00:00:00
52B2021-05-01 00:00:00
63B2021-05-02 00:00:00

4. 書いたSQL

SQL

1SELECT 2 ar.article_id, 3 ar.user_id, 4 ar.updated_at 5FROM articles AS ar 6WHERE ar.updated_at = ( 7 SELECT MAX(updated_at) as updated_at 8 FROM articles AS sub_ar 9 WHERE sub_ar.type = 'B' 10 AND sub_ar.updated_at <= {指定の日付(Y-m-d)} 11 AND sub_ar.user_id = ar.user_id 12 AND deleted_at IS null 13);

 
以下のサイトをお手本にしながら書きました。
https://www.yuulinux.tokyo/17432/
https://dev.mysql.com/doc/refman/5.6/ja/example-maximum-column-group-row.html

でもうまく書けず、思うような結果が取得できませんでした。
もしよければ、アドバイスいただけると嬉しいです。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/05/19 09:41

〈指定日付以降で最新の更新日付(updated_at)を取得〉不等号の向きが間違ってる気がする
guest

回答2

0

type[A]とtype[B]の同一useridとupdated_atがある可能性があるから排除しないと
ダメだと思います。あとはtype[B]内で同一useridによる同一updated_atがあるarticlesがあった場合
結果は複数行でてよいのでしょうか?

sql

1select A.article_id, 2 A.user_id, 3 A.updated_at 4from articles AS A 5where A.type='B' 6 and A.deleted_at is null 7 and not exists ( 8 select 0 9 from articles as B 10 where B.type='B' 11 and B.deleted_at is null 12 and B.user_id = A.user_id 13 and B.updated_at>A.updated_at 14 )

投稿2021/05/20 00:39

編集2021/05/20 01:06
sousuke

総合スコア3828

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

わかんないけど。
MAXとか集約関数を使うならGROUP BY句は必要。
user_idごとの最大値がほしいはずなので、サブクエリーでuser_idも求めないと意味がない。

sql

1SELECT 2 ar.article_id, 3 ar.user_id, 4 ar.type, 5 ar.updated_at, 6 ar.deleted_at 7FROM articles AS ar 8WHERE (ar.user_id, ar.updated_at) IN ( 9 SELECT sub_ar.user_id, MAX(sub_ar.updated_at) as updated_at 10 FROM articles AS sub_ar 11 WHERE sub_ar.type = 'B' 12 AND sub_ar.updated_at <= {指定の日付(Y-m-d)} 13 AND sub_ar.deleted_at IS null 14 GROUP BY sub_ar.user_id 15) 16ORDER BY ar.user_id;

ORDER BY句が必要な気がするけど、とくに条件が指定されていないので、user_id順にしてみた。

投稿2021/05/19 09:47

編集2021/05/19 09:49
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問