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

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

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

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

PHP

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

1回答

1767閲覧

Laravelのクエリビルダーでレコードが存在しない会員を取得したい

yoto009

総合スコア9

MySQL

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

PHP

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2021/10/09 04:15

編集2021/10/11 01:01

前提・実現したいこと

お世話になっております。
タイトルの通りですがLaravelのクエリビルダーでレコードが存在しない会員を取得したいのですが、クエリの発行がうまくいかず期待通りの結果が取得できず2日程悩んでも解決しなかったのでアドバイスいただければ幸いですm(__)m。よろしくお願い致します。

【取得したい結果】
lecture_group_attendances.attendanceが20でかつlecture_user_statuses.statusが終了またはレコードが存在しない会員

※イレギュラーな対応でlecture_group_attendancesにはレコードがあるがlecture_user_statusesには同会員のレコードがない状態
※テーブル構造に関しては仕様上変更できない状態

使用するテーブル

【users】

user_idnamestatus
1ユーザー1登録済
2ユーザー2登録済
3ユーザー3登録済

【lectures】

lecture_idnamelecture_group_id
1地理学科1
2文学科1
3心理学科1
4教育学科2

【lecture_groups】

lecture_group_idname
1文学部
2教育学部

【lecture_group_attendances】

lecture_group_iduser_idattendance
1120
226
1320

【lecture_user_statuses】

lecture_user_status_iduser_idlecture_idstatus
111終了
222継続
### 実行したクエリ
以下クエリでは終了の会員は取得できるがlecture_user_statusesにレコードが存在しない会員を取得できない。
サブクエリやnot exitsを使ったりもしましたがうまくいきませんでした。
```
$lecture_ids = [1,2]
DB::table($this->getTable())
->select([ 'users.user_id', ]) ->leftJoin('lectures', 'lecture_group_attendances.lecture_group_id', '=', 'lectures.lecture_group_id') ->join('lecture_user_statuses', function ($join) { $join->on('lectures.lecture_id', '=', 'lecture_user_statuses.lecture_id') ->on('lecture_group_attendances.user_id', '=', 'lecture_user_statuses.user_id'); }) ->join('users', 'lecture_user_statuses.user_id', '=', 'users.user_id') ->where('lecture_group_attendances.attendance', 20) ->whereIn('lecture_user_statuses.lecture_id', $lecture_ids) ->where(function ($query) { $query->where('lecture_user_statuses.status', '終了') ->orWhereNull('lecture_user_statuses.status'); }) ->where('users.status', '!=', '退会') ->pluck('user_id');

$lecture_ids = [1,2];

DB::table($this->getTable()) ->select([ 'users.user_id', ]) ->leftJoin('lectures', 'lecture_group_attendances.lecture_group_id', '=', 'lectures.lecture_group_id') ->join('lecture_user_statuses', function ($join) { $join->on('lectures.lecture_id', '=', 'lecture_user_statuses.lecture_id') ->on('lecture_group_attendances.user_id', '=', 'lecture_user_statuses.user_id'); }) ->join('users', 'lecture_user_statuses.user_id', '=', 'users.user_id') ->where('lecture_group_attendances.attendance', 20) ->whereIn('lecture_user_statuses.lecture_id', $lecture_ids) ->where(function ($query) use ($lecture_ids) { $query->where('lecture_user_statuses.status', '終了') ->orWhereRaw("not exits ( select `users`.`user_id` from `lecture_group_attendances` left join `lectures` on `lecture_group_attendances`.`lecture_group_id` = `lectures`.`lecture_group_id` inner join `lecture_user_statuses` on `lectures`.`lecture_id` = `lecture_user_statuses`.`lecture_id` and `lecture_group_attendances`.`user_id` = `lecture_user_statuses`.`user_id` inner join `users` on `lecture_user_statuses`.`user_id` = `users`.`user_id` where `lecture_group_attendances`.`attendance` = 20 and `lecture_user_statuses`.`lecture_id` in {$lecture_ids} and `lecture_group_attendances`.user_id = `lecture_user_statuses`.user_id)"); }) ->where('users.status', '!=', '退会') ->pluck('user_id');
### 補足情報(FW/ツールのバージョンなど) - Laravel5.5 - php7.2

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

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

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

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

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

guest

回答1

0

ベストアンサー

lecture_user_statusesテーブルについても、left joinすれば良いのではないでしょうか。

投稿2021/10/11 02:09

MYas30

総合スコア29

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

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

yoto009

2021/10/11 03:28

ご回答ありがとうございます。 leftjoinは1度試したのですが結果は取得できませんでした
MYas30

2021/10/11 08:15

結合元になっているテーブルはlecture_group_attendancesですかね。 ->leftJoin('lecture_user_statuses', 'lecture_group_attendances.user_id', '=', 'lecture_user_statuses.user_id') とかでいけそうな気がするんですが、いかがでしょうか。
yoto009

2021/10/11 09:38

結合元のテーブルを変更してleftjoinして、join('users', 'lecture_user_statuses.user_id', '=', 'users.user_id')をlecture_group_attendancesに変更したところ取得できるようになりました! ありがとうございます!助かりました!
MYas30

2021/10/11 10:05

お役に立ててよかったです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問