/note/tech

一対多関係のテーブルを複数行取得したい、とか

以下のようなテーブルがあったとして(外部キーやインデックス指定などは省略)。

CREATE TABLE `users` (
    `id`        int(11) unsigned NOT NULL AUTO_INCREMENT,
    `name`      varchar(255) NOT NULL,
    `sex`       char(1) NOT NULL,
    `birthday`  date NOT NULL,
    PRIMARY KEY (`id`)
);

CREATE TABLE `user_groups` (
    `id`       int(11) unsigned NOT NULL AUTO_INCREMENT,
    `user_id`  int(11) unsigned NOT NULL,
    `group_id` int(11) unsigned NOT NULL,
    PRIMARY KEY (`id`)
);

CREATE TABLE `groups` (
    `id`       int(11) unsigned NOT NULL AUTO_INCREMENT,
    `name`     varchar(255) NOT NULL,
    PRIMARY KEY (`id`)
);

「ユーザーを特定の条件で絞り込みたい+それらのユーザーが属するグループも一緒に出力したい」」みたいな要件はよくあることで、そういう場合の処理としては、以下のようなプログラムを書くことになるわけだが。

別にこの方法が間違っているとは思わないけど、他に方法はあったりするのかしら?

users と user_groups を結合して、無理矢理一度のクエリでレコードを取得することもできなくはないけど、その場合 users のレコードが user_groups のレコード分増殖するので、グルーピングや検索条件が複雑化すると意図せぬバグを埋め込んだり、コードの見通しが悪くなりそうなのが心配なんだよなぁ