実現したいこと
1申込を1行として、その1行の1カラムに複数商品を登録した順番で表示したい
出力したいイメージは以下
■出力したい形式
|申込番号|商品|店舗|
|:--|:--:|
|申込1|商品A/商品C/商品B | 店舗1
|申込2|商品C/商品B/商品A | 店舗2
■SQL(Postgres)
SELECT 申込.ID,商品名, 店舗.店舗名 FROM INNER JOIN ( SELECT 申込詳細.id, (ARRAY_TO_STRING(ARRAY_AGG(商品.名前), ' / ')) AS 商品名, 店舗.名前 FROM ( SELECT 申込詳細.*, 商品.* FROM 申込詳細 INNER JOIN 商品 ON 申込詳細.商品ID = 商品.id ORDER BY 申込詳細.id ASC ) AS 申込商品 INNER JOIN 店舗 ON 申込商品.店舗ID = 店舗.id GROUP BY 申込商品.id, 商品.名前 ) INNER JOIN 申込 ON 申込.ID = 申込商品.申込ID
分からないこと
申込詳細と商品を結合したテーブルにエイリアスをつける方法。
結合した際に一度申込詳細.idの昇順で並び替えているのは、商品と結合した段階で
申込時に登録した商品の順番ではなく、商品IDで連結されてしまうため
試していること
■試行錯誤中のクエリ
A:申込詳細
B:商品
C:店舗
$query = $this->A->find(); $query->select([ 'A__id' => 'A.id', 'B__names' => $query->newExpr()->add("ARRAY_TO_STRING(ARRAY_AGG(\"B\".\"name\"), ' / ')"), 'C__name' => 'C.name', ]); $query->join( [ 'B' => [ 'table' => 'b', 'type' => 'INNER', 'conditions' => [ 'A.product_id' => new IdentifierExpression('C.id'), ], ], ] ); $query->join( [ 'C' => [ 'table' => 'c', 'type' => 'INNER', 'conditions' => [ 'B.shop_id' => new IdentifierExpression('C.id'), ], ], ] ); $query->group(['A.id', 'C.name']);
まとめ
こちらに関して、解決方法をご存知の方いらっしゃいましたらアドバイス頂けますと幸いです。
更新(2021/06/15)
クエリにエイリアスを設定する方法は相変わらず分かっておりませんが、実現したかった表示順に関しては、
以下で解決しました。
(ARRAY_TO_STRING(ARRAY_AGG(商品.名前) ORDER BY 申込詳細.ID, ' / ')) AS 商品名,
あなたの回答
tips
プレビュー