LoginSignup
0
0

More than 3 years have passed since last update.

[mysql,laravel]あるカラムで重複を持つレコードだけをまとめずに全て呼び出す方法

Last updated at Posted at 2020-06-03

何をした?

operationsテーブルから"第三工種"というカラムで重複するレコードに付随しているデータの塊を作りたいと考えました。

具体的には"第三工種"に"土工"というレコードが複数ある場合、それ以降の”第四工種”以降が"埋め戻し"のものや”掘削"のものなどに分岐します。
それを”第三工種に土工を持つもの全て"で一括りの配列にして、呼び出したいと考えました。

(参考)ER図
v4.png

失敗した方法

ひとことで言うと、クエリによる処理でなく配列処理で対応しようとしたらドツボにはまりました。

※詳細(分かりにくいので、お急ぎの方は読まなくて大丈夫です)

まずテーブルから全レコードを呼び出し、distinct()で重複を絞った後、その"id"を持つ"第三工種"を抜き出します。その"第三工種"のレコードを持つものをforeacharray_keys()により、distinct()してないものと比較することで新しい1次配列を作り、そこからviewに呼び出そうとしました。

array_key()はオブジェクトに対して使えないというエラーで挫折しました。
コレクションを使えばいけるかもしれなかったですが、1次配列にしてしまうと呼び出しも厄介なので中断しました。

→代案で"id"を抽出した後、全て入ったデータからarray_column()でそれぞれのカラムを抜き出して、呼び出しの時に該当のidを使って呼び出すことを考えましたが、array_column()もオブジェクトに対して使えないというエラーが出たので中断しました。

解決方法

下記のsqlをコントローラで書き出して、”第三工種”が同じものだけの配列にまとめることで対応しました。

sequelproのクエリで実行した記述
SELECT
    operations.id,
    operations.third_operation_class
FROM
    -- サブクエリで件数を取得
    (
    SELECT
        third_operation_class,
        COUNT(third_operation_class) AS CNT
    FROM
        operations
    GROUP BY
        third_operation_class
    ) AS third_operation_class_CNT
-- 自己結合
INNER JOIN
    operations
ON
    third_operation_class_CNT.third_operation_class = operations.third_operation_class
AND
    third_operation_class_CNT.CNT > 0;

#上記の結果
id  third_operation_class
8   お試し3
9   河川土工
16  土工
17  土工
18  土工
19  土工
20  土工
21  土工
22  土工

その後

この記述で他のカラムも呼び出して、"third_operation_class"が同じものだけでまとめることで、欲しい値だけの配列ができるので、そこにforeachでインデックス番号をふって、そのインデックス番号でページを分けて表示しました。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0