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

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

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

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

936閲覧

SQLで3つのテーブルから情報を取得したい

Tak_

総合スコア13

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2021/06/27 14:57

編集2021/06/27 14:59

以下の3つのテーブルからプロジェクトに対する最終更新者と更新日時を取得するにはどう記述すればいいでしょうか。
使用しているのはSQLiteです。

テーブル:PROJECT

IDPROJECTNAME
1hoge
2hage
3hige

テーブル:USER

IDUSERNAME
1YAMADA
2SATO

テーブル:HISTORY(UPDATEDT順になっている)

IDPROJECTID(=PROJECT.ID)USERID(=USER.ID)UPDATEDT
1112021/06/26 2:10:00
2122021/06/27 12:00:00
3112021/06/27 21:00:00
4222021/06/28 16:45:00

上記から、以下の情報を取得したいです。

PROJECTIDPROJECTNAMEUSERNAMEUPDATEDT
1hogeYAMADA2021/06/27 21:00:00
2hageSATO2021/06/28 16:45:00
3hage

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

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

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

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

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

guest

回答2

0

history に(PROJECTID, UPDATEDT desc, USERID)というインデックスを追加すると効率的だと思います。

SQL

1select prj.*, usr.username 2from ( 3 select prj.* 4 , max(his.updatedt) over(partition by his.projectid) as lastupdate 5 from project as prj 6 left join history as his 7 on prj.id = his.projectid 8 ) as prj 9 left join history as his 10 on prj.id = his.projectid 11 and prj.lastupdate=his.updatedt 12 left join user as usr 13 on usr.id = his.userid

projectから取得する項目が限定されるなら、いっそ以下の方が高速だと思います。

SQL

1select prj.*, usr.username 2from ( 3 select prj.id, prj.projectname 4 , max(his.updatedt) as lastupdate 5 from project as prj 6 left join history as his 7 on prj.id = his.projectid 8 group by prj.id, prj.projectname 9 ) as prj 10 left join history as his 11 on prj.id = his.projectid 12 and prj.lastupdate=his.updatedt 13 left join user as usr 14 on usr.id = his.userid

投稿2021/06/27 16:18

編集2021/06/27 16:28
sazi

総合スコア25327

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

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

0

ベストアンサー

やり方はいろいろあると思いますが、たとえば以下のようなクエリで実現できるかと思います。

SQL

1SELECT P.id, P.projectname, U.username, H.updatedt 2FROM PROJECT AS P 3LEFT OUTER JOIN ( 4 SELECT *, ROW_NUMBER() OVER (PARTITION BY projectid ORDER BY updatedt DESC) AS rownum 5 FROM HISTORY 6) AS H ON P.id = H.projectid 7LEFT OUTER JOIN USER AS U ON U.id = H.userid 8WHERE rownum IS NULL OR rownum = 1;

投稿2021/06/27 15:41

neko_the_shadow

総合スコア2349

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

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

Tak_

2021/06/28 02:51

実行速度が早かったです。ありがとうございます。
sazi

2021/06/28 03:11

@Tak_さん 特にインデックスは無しという状況でしょうか?
Tak_

2021/06/30 09:33

はい、現状インデックスは作成していません。 少し時間ができたらインデックスを作成してどれだけ改善できるか試してみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問