表題の件に関して、ご教示いただけますと幸いです。
実際のテーブルの簡略版のため、テーブル構造に関するご指摘は御容赦いただけますと幸いです。
userテーブルのデータ1に対して、actionテーブルのデータは多数あります。
userテーブル:actionテーブルが1:0になることもありえます。
user毎にactionテーブルのdateが最大または、actionテーブルにデータが最大のレコードを取得しようと色々試したのですが、
いまいちうまくいきません。
サンプルデータ(actionテーブルのレコードが1-3まで) の場合、理想としている結果は、下記のとおりです。
###質問1
user_idをキーとしてactionテーブルとuserテーブルを結合し、userに対してactionテーブルのレコードが複数ある場合には、action.dateが最も最新のデータのみを取得したいです。
また、合わせて、actionにレコードが存在しないuserは、actionのカラムをNULLにした形で取得したいです。
下記のような結果を取得するには、どのようなSQLが適当でしょうか?
user_id,name,action_id,date,action ===================================== 1,yamada,2,2019-01-02,rest 2,suzuki,NULL,NULL,NULL 3,sato,3,2019-01-02,shopping
###質問2
サンプルデータで、actionテーブルのレコードが1-4まであった場合、
yamadaさんのレコードをactionがworkのレコードで絞り込みたいです。
その際にはどのようなSQLが適当になりますでしょうか。
DBはMySQL5.6系になります。
お手数ですが、ご教授いただけますと幸いです。
★サンプルデータ★
※userテーブルのuser_idが、actionテーブルのuser_idとマッピングされます。
######【userテーブル】
- テーブル作成
SQL
1CREATE TABLE `user` ( 2`user_id` bigint(20) NOT NULL AUTO_INCREMENT, 3`name` text, 4PRIMARY KEY (`user_id`) 5);
- データ投入
SQL
1INSERT INTO user VALUES(NULL,"yamada"); 2INSERT INTO user VALUES(NULL,"suzuki"); 3INSERT INTO user VALUES(NULL,"sato");
- テーブル内のデータ
user_id | name |
---|---|
1 | yamada |
2 | suzuki |
3 | sato |
######【actionテーブル】
- テーブル作成
SQL
1CREATE TABLE `action` ( 2`action_id` bigint(20) NOT NULL AUTO_INCREMENT, 3`user_id` bigint(20) NOT NULL, 4`date` date NOT NULL, 5`action` text NOT NULL, 6PRIMARY KEY (`action_id`) 7);
- データ投入
SQL
1INSERT INTO action VALUES(NULL,1,"2019-01-01","work"); 2INSERT INTO action VALUES(NULL,1,"2019-01-02","rest"); 3INSERT INTO action VALUES(NULL,3,"2019-01-02","shopping"); 4INSERT INTO action VALUES(NULL,1,"2019-01-01","shopping");
- テーブル内のデータ
action_id | user_id | date | action |
---|---|---|---|
1 | 1 | 2019-01-01 | work |
2 | 1 | 2019-01-02 | rest |
3 | 3 | 2019-01-02 | shopping |
4 | 1 | 2019-01-01 | shopping |
回答2件
あなたの回答
tips
プレビュー