質問: SQL文について質問です。 以下の2つのテーブルがあります。 1テーブル:koushi_account カラム:useId,viewName 1,A 2,B 3,C 4,D 2テーブル:opening カラム:id, koushaid,date,hour 1,1,2021-09-20,14 2,1,2021-09-20,15 3,1,2021-09-20,16 ~~ 16,1,2021-09-21,14 17,1,2021-09-21,15 3テーブル:lesson カラム:id,date,starthour,koushi,seitoId,sub 1,2021-09-20,14,A,428,数 2,2021-09-20,14,A,429,数 3,2021-09-20,14,A,'','' 4,2021-09-20,14,B,430,数 5,2021-09-20,14,B,'','' 6,2021-09-20,14,B,'','' 7,2021-09-20,15,A,428,英 8,2021-09-20,15,A,'','' 9,2021-09-20,15,A,'','' 10,2021-09-20,15,B,430,数 11,2021-09-20,15,B,'','' 12,2021-09-20,15,B,'','' ~~~ 21,2021-09-21,14,C,'','' 22,2021-09-21,14,A,429,数 23,2021-09-21,14,A,'','' 24,2021-09-21,14,B,430,数 25,2021-09-21,14,D,'','' 26,2021-09-21,14,D,'','' 27,2021-09-21,15,A,428,英 28,2021-09-21,15,C,'','' 29,2021-09-21,15,A,'','' 20,2021-09-21,15,B,430,数 21,2021-09-21,15,D,'','' 22,2021-09-21,15,B,'','' このようなテーブルが2つあり、SQLを実行して以下のような結果を得たいです。 hour/subs 14/2021-09-20@3*ABB,2021-09-21@4*ACDD, 15/2021-09-20@4*AABB,2021-09-21@4*ABCD, 中身をまとめると、 時間ごとに空き席の数を検索して、その空きがあるkoushiの羅列を文字列として取得したいです。 (※文字列の羅列(ABCDなど)を最終的にはセレクトボックスにて表示させたいです。koushi_accountから条件付きで検索かけようと思っていますが、ちょっと思案しています。これについてもっといい方法があれば教えてほしいです。 セレクトボックスを選択したらその時点でDBアクセスしリストを取得するなどできれば一番理想的(スピードが速い)ではありますが、難易度が高そうで着手していません) とりあえずSQL文の書き方が知りたいです。 2日間悪戦苦闘していますが、躓いて前に進めません。 どうかアドバイスをお願いします。 SELECT opening.hour as openinghour ,opening.date ,group_concat(opening.date,'@', le2.cnt_view,'*',CASE WHEN le2.leee IS NULL THEN '満席' ELSE le2.leee END ) as subs from opening left join ( select count(koushi_account.viewName) as cnt_view,group_concat(koushi_account.viewName) as leee ,date,starthour FROM lesson inner join koushi_account on lesson.koushi=koushi_account.userId where lesson.seitoId='' AND lesson.del=0 and lesson.koushi!='欠席' and lesson.kousha_id=1 ) as le2 on le2.date=opening.date and le2.starthour=opening.hour where (opening.date BETWEEN '2021-08-16' AND '2021-08-22' ) group by opening.hour
回答: lessonテーブルは正規化されていないですね。まず、lessonの日時は、openingテーブルのidで持つべきで、lessonに日時を持っているのなら、openingテーブルが存在している意味がない。koushiとsubjectの関連は、koushi_accountに持つか、別の関連テーブルに持つか。それからseitoを管理するテーブルも別に必要ですね。この辺、あまりERモデルを分かっていない人が設計していますね。 それはともかく、 14/2021-09-20@3*ABB,2021-09-21@4*ACDD, これのABBとかACDDとかが、何を表示するものなのか、何度読んでも仕様が読み取れないので、そこを解説してもらわないと答えようがないですね。