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

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

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

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

Q&A

解決済

2回答

6015閲覧

SQLで、GROUP BYしてグループ化後に、最新(created_at)のみ取得するクエリについて

usop

総合スコア64

SQL

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

0グッド

0クリップ

投稿2016/04/13 04:58

お世話になります。

SQLのクエリで、自己解決できない問題があり、質問させていただきました。

テーブル構造
user ユーザテーブル
id, name
work 仕事テーブル
id, name
user_order_work 応募管理テーブル
id, user_id, work_id, createdAt

※応募は、同じユーザが同じ仕事になんども投稿できるとする。

問題
上記のテーブル構造から、

「ある仕事(work.id=1)の応募一覧を、応募したユーザが重複しない形で取得する。なおかつ、応募したユーザが重複している場合は、そのユーザが、最後に(最新の)応募した時の応募管理情報を取得する」

と言う問題を解決したいです。

SELECT * FROM user_order_work as uow left join work as w ON uow.work_id = w.id where w.id = 1 group by uow.user_id;

上記のクエリを書いてみたのですが、「ある仕事の応募一覧を、応募したユーザが重複しない形で取得する。」までは、クリアできます。しかし、「応募したユーザが重複している場合は、そのユーザが、最後に(最新の)応募した時の応募管理情報を取得する」がクリアできません。

どのようなクエリを書けば、この問題をクリアできますか?

よろしくお願い致します。

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

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

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

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

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

KiyoshiMotoki

2016/04/13 05:37

お使いのDB製品(MySQL or PostgreSQL or ... など)を教えてください。それによって、解決策が変わる可能性がありますので。
guest

回答2

0

ベストアンサー

IDも含めて全部データがほしいならしたみたいな感じで
最後の応募を求めてからJOINすればいいです

SQL

1SELECT 2 USER_ORDER.* 3FROM ( 4 SELECT 5 user_id 6 , work_id 7 , MAX(createdAt) createdAt 8 FROM user_order_work 9 WHERE work_id = 1 10 GROUP BY 11 user_id 12 , work_id 13) LAST_ORDER 14JOIN user_order_work USER_ORDER 15ON USER_ORDER.user_id = LAST_ORDER.user_id 16AND USER_ORDER.work_id = LAST_ORDER.work_id 17AND USER_ORDER.createdAt = LAST_ORDER.createdAt 18

IDがいらないなら最後の応募を求めているLAST_ORDERの中だけで事足ります

投稿2016/04/13 05:35

kutsulog

総合スコア985

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

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

0

select * の部分を以下のようにしてみてはいかがでしょう?

SQL

1 select MAX(created_at), 取得したいカラム.... FROM ....

投稿2016/04/13 05:03

編集2016/04/13 05:25
ShoheiUyama

総合スコア206

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

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

usop

2016/04/13 05:33

超速のコメントありがとうございます。 select MAX(created_at)だと、created_atしかselectされません。 select *, MAX(created_at)だと、取得結果としては、user_order_workと、userの最新応募しては、紐付きますが、user_order_workのデータとしては、紐付かない形となります。 こう言った場合は、subQueryがいいのでしょうか
ShoheiUyama

2016/04/13 05:41

SELECT MAX(uow.created_at), uow.work_id,... のように*を使用しない記法に変更してもダメでしょうか? *を使いたいのであればサブクエリ化も考えたほうが良いかもしれませんね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問