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

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

ただいまの
回答率

90.52%

  • MySQL

    5852questions

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

  • CakePHP

    2311questions

    CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Cakephp3のSQL文について

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 481

ssk

score 269

//Hoges.Contoroller.php
->select([
'id','dal01','dal02','dal03','dal04','dal05','dal06','dal07','dal08','dal09','dal10','dal11','dal12','dal13','dal14',
'dal15' => 'group_concat(Dal_List1s.Ms_azdal1 SEPARATOR ";")',
'dal16' => 'group_concat(Dal_List2s.Ms_azdal2 SEPARATOR ";")',
]
                )
->join([
'table' => 'dal_list1s',
'type' => 'LEFT',
'conditions' => 'dal_list1s.datacklist_id = datacklists.id'
                ])
->join([
'table' => 'az_dal1s',
'type' => 'LEFT',
'conditions' => 'az_dal1s.id = dal_list1s.ms_azdal1'
                ])
->join([
'table' => 'dal_list2s',
'type' => 'LEFT',
'conditions' => 'dal_list2s.datacklist_id = datacklists.id'
                ])
->join([
'table' => 'az_dal2s',
'type' => 'LEFT',
'conditions' => 'az_dal2s.id = dal_list2s.ms_azdal2'
                ])
->where([
'datacklists.id' => $id
                ])
->group(['datacklists.id']);

$datacklist = $query->first();

取得されているgroup_concatの箇所

'dal15' => '3;5;6;3;5;6;3;5;6',
'dal16' => '4;4;4;5;5;5;6;6;6',

レコードが9行、生成されているため
このような現象になっているかと、、、

'dal15' => '3;5;6;',
'dal16' => '4;5;6',

と取得したいです。
発行しているSQL文は以下です。

SELECT 
  Datacklists.id AS `Datacklists__id`, 
  Datacklists.dal01 AS `Datacklists__dal01`, 
  Datacklists.dal02 AS `Datacklists__dal02`, 
  Datacklists.dal03 AS `Datacklists__dal03`, 
  Datacklists.dal04 AS `Datacklists__dal04`, 
  Datacklists.dal05 AS `Datacklists__dal05`, 
  Datacklists.dal06 AS `Datacklists__dal06`, 
  Datacklists.dal07 AS `Datacklists__dal07`, 
  Datacklists.dal08 AS `Datacklists__dal08`, 
  Datacklists.dal09 AS `Datacklists__dal09`, 
  Datacklists.dal10 AS `Datacklists__dal10`, 
  Datacklists.dal11 AS `Datacklists__dal11`, 
  Datacklists.dal12 AS `Datacklists__dal12`, 
  Datacklists.dal13 AS `Datacklists__dal13`, 
  Datacklists.dal14 AS `Datacklists__dal14`, 
  group_concat(
    Dal_List1s.Ms_azdal1 SEPARATOR ";"
  ) AS `dal15`, 
  group_concat(
    Dal_List2s.Ms_azdal2 SEPARATOR ";"
  ) AS `dal16` 
FROM 
  datacklists Datacklists 
  LEFT JOIN dal_list1s ON dal_list1s.datacklist_id = datacklists.id 
  LEFT JOIN az_dal1s ON az_dal1s.id = dal_list1s.ms_azdal1 
  LEFT JOIN dal_list2s ON dal_list2s.datacklist_id = datacklists.id 
  LEFT JOIN az_dal2s ON az_dal2s.id = dal_list2s.ms_azdal2 
WHERE 
  datacklists.id = '2' 
GROUP BY 
  datacklists.id 
LIMIT 

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

joinを複数回繋ぐと普通に起きる問題ですから
正規化についてすこし学習されるとよいでしょう

サブクエリなどでgroup_concatする項目を意識して先に整理し
あとからjoinで情報を追加するような対応になると思いますが
最初から広げすぎなのでもう少し簡単なサンプルをつかって
ご自身でいろいろ試してみたほうがよろしいかと

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/24 13:33

    助言ありがとうございます。

    yambejp様でしたら
    >>>サブクエリなどでgroup_concatする項目を意識して先に整理
    はどのように書きますでしょうか?

    教えていただけると幸いです。
    よろしくお願いいたします。

    キャンセル

  • 2017/02/24 13:44 編集

    例示のSQL文だけでは判断つきませんがたぶん
    dal_list1sとaz_dal1sの組み合わせでgroup_concat
    dal_list2sとaz_dal2sの組み合わせでgroup_concat
    した上で、それぞれをサブクエリとしてdatacklistsにjoinする
    ことになるでしょうね

    逆にあまり難しいことを考えずに、たんにgroup_concat内の
    ダブリを取りたいだけであれば、group_concat内でdistinct処理が
    可能です。マニュアルを確認してください

    https://dev.mysql.com/doc/refman/5.6/ja/group-by-functions.html#function_group-concat

    キャンセル

  • 2017/02/24 14:42

    ありがとうございます。
    ひとまず、distinctで対応できそうです。

    yambejp様のおっしゃる通り、group_concatと正規化についてもう少し勉強します。

    キャンセル

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • MySQL

    5852questions

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

  • CakePHP

    2311questions

    CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。