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

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

新規登録して質問してみよう
ただいま回答率
85.48%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

1936閲覧

チェックボックスの値を別の累積テーブルにした場合の検索用SQL

grnfnt

総合スコア48

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

1クリップ

投稿2015/08/11 03:04

[親テーブル]
create table example(
number int unsigned auto_increment not null primary key,

);

[親テーブルに紐づくチェックボックス用テーブル]
create table example_checkbox(
example_number int unsigned not null,

);

numberとexample_numberで繋がっているのですが、チェックボックス用テーブルには、
チェックボックスにチェックされたIDが累積して格納されております。
本来ならばexampleテーブルに正規化して持たせたかったのですが、チェックボックス
の数は可変するため、別テーブルにしております。

exampleテーブルの一覧を出す際に、example_checkboxでチェックされているか否かの
条件を入れたいのですが、exampleとexample_checkboxは1対多であるため、joinを使うと
example_checkboxの数分結果が返ってきてしまうものと想定しておりますが、何かうまい
やり方はないものでしょうか。

アドバイスいただければ幸いです。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

本来ならばexampleテーブルに正規化して持たせたかったのですが、チェックボックス

いや、むしろ今が正規化されていて、もし example テーブルに「check1, check2, check3, ...」などともたせるとむしろ正規化されていないと思います。

exampleテーブルの一覧を出す際に、example_checkboxでチェックされているか否かの
条件を入れたいのですが、exampleとexample_checkboxは1対多であるため、joinを使うと
example_checkboxの数分結果が返ってきてしまうものと想定しておりますが、

example_checkbox が下記のようなテーブルなのだとして・・・(example_check は選択されていたチェックボックスの値)

sql

1create table example_checkbox( 2 example_number int unsigned not null, 3 example_check int unsigned not null, 4 primary key (example_number, example_check) 5);

以下のように結合する分には重複は現れないと思いますけど?

select E.* from example E inner join example_checkbox C on C.example_number = E.number where C.example_check = 3

example_checkbox テーブルは example_number と example_check で一意になるはずなので、example_check = 3 のように example_check を特定すれば、その詳細度は example テーブルと同じ(example_number ごと)だと思います。

(もし、複数の値で OR 検索、であれば話は変わりますが)


相関サブクエリで exists したり、

sql

1select E.* 2from example E 3where 4 exists ( 5 select * from example_checkbox C 6 where C.example_number = E.number 7 and C.example_check in (2, 3, 4) 8 )

サブクエリを in してみたり、

sql

1select E.* 2from example E 3where 4 E.number in ( 5 select example_number from example_checkbox 6 where example_check in (2, 3, 4) 7 )

group by なサブクエリを join したり、

sql

1select E.* 2from example E 3inner join ( 4 select example_number from example_checkbox 5 where example_check in (2, 3, 4) 6 group by example_number 7) C 8on C.example_number = E.number

いずれも試してはいないので、上手くできなかったらごめんなさい。

サブクエリを使わずに group by や distinct で重複行を排除するという方法も考えられると思います。

投稿2015/08/11 03:23

編集2015/08/11 08:28
ngyuki

総合スコア4514

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

grnfnt

2015/08/11 07:50

大事なことを書いておらず申し訳ありません。 最後のところでおっしゃる通りで、検索はORが入ります。 つまりは、example_check in (2,3,4)のようになるので複数返ってきて しまうのが問題とみているのですが、何か良い方法ございますでしょうか。 とてもわかりやすく解説いただきありがとうございます。
ngyuki

2015/08/11 08:29

追記しました
grnfnt

2015/08/11 09:26

素晴らしいの一言です。 実は返答をいただくまでdistinctを使用して試していたのですが、これでも同じ結果が返ってきてうまくいきました。 相関サブクエリは初めて知ったので、これから使っていこうかと思います。 本当に申し分のない素晴らしいご返答をいただき、ありがとうございました。 いただいた内容はドキュメントに入れておきたいと思います。 この場をお借りし御礼申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問