
お世話になります。
商品データとカテゴリテーブルをそれぞれ分けたデータベースを作っており、JOINで該当カテゴリ名を抽出しています。
しかし商品によって複数のカテゴリに属する(カンマ区切りで「1,2,3」というように現状格納しています)場合、それらのすべてを拾ってくることは可能でしょうか?
またカテゴリひとつひとつに対して商品データ内にカラムを用意するべきでしょうか?
select `shop`.no, left outer join list_category on `shop`.category=`list_category`.no (現状)
どうぞよろしくお願い致します。
No.4ベストアンサー
- 回答日時:
作り直す気があるならこんな感じ
//元データ
create table shohin(sid int,sname varchar(30));
insert into shohin values(1,'パソコン'),(2,'洗濯機'),(3,'車');
create table category (cid int,cname varchar(30));
insert into category values('1','OA機器'),('2','家電'),('3','大型');
create table category_shohin (cid int,sid int);
insert into category_shohin values(1,1),(2,1),(2,2),(3,2),(3,3);
//商品ごとにカテゴリー名を羅列
select s.sid,s.sname,sub.cnames from shohin as s
inner join (
select sid,group_concat(cname) as cnames
from category as c
inner join category_shohin as cs
on cs.cid =c.cid
group by sid
) as sub
on s.sid=sub.sid
あとは最終形をどう見せたいかによります
中間テーブルとはこのように使うのですね!さらにサンプルコードまで書いていただきありがとう御座いました!とても勉強になりました。
テーブルをより少なくすれば単に早くなるのではと勘違いをしていました。
実行そてみたら0.0010秒ほどで驚きです!
No.3
- 回答日時:
商品とカテゴリは多対多関係なので、素直に中間テーブルを設けることをオススメします。
○ 物理設計
商品情報 ([商品ID], 商品名, ...)
商品カテゴリ ([商品ID], [カテゴリID])
カテゴリ情報 ([カテゴリID], カテゴリ名, ...)
○ 問い合わせ例
select A.商品名, C.カテゴリ名
from 商品情報 as A
left join 商品カテゴリ as B on A.商品ID = B.商品ID
left join カテゴリ情報 as C on B.カテゴリID = C.カテゴリID
○ 問い合わせ例の結果
ドラム, null ← カテゴリ無し
ピアノ, クラシック ← カテゴリ一件
ギター, クラシック
ギター, エレキ ← カテゴリ二件
No.2
- 回答日時:
別質問の例をもとにすればこんな感じ
//元データ
create table shohin (sid int,sname varchar(30),cid varchar(200));
insert into shohin values(1,'パソコン','_1_2_'),(2,'洗濯機','_2_3_'),(3,'車','_3_');
create table category (cid varchar(10),cname varchar(30));
insert into category values('1','OA機器'),('2','家電'),('3','大型');
//商品ごとにカテゴリー名を羅列
select s.sid,s.sname,sub.cnames from shohin as s
inner join (
select sid,group_concat(cname) as cnames
from category as c
inner join shohin as s
on s.cid like concat('%_',c.cid,'_%')
group by sid
) as sub
on s.sid=sub.sid
No.1
- 回答日時:
>カンマ区切りで「1,2,3」
カテゴリー=商品テーブルをつくってきちんと正規化する方が
データ管理はしやすいとおもいますよ
この方式でどうしてもやりたいなら
「,1,2,3,」と先頭と末尾にもカンマをつけて
カテゴリーテーブルと組み合わせるとき
商品テーブルのカラム like concat(',',カテゴリーテーブルのカラム,',')
のようにすることです
この回答への補足
早速の解答ありがとうございます。
やはりテーブルを設けた方が良いのですね。
例えば対応言語でカテゴリ分けする場合、日本語や英語でそれぞれフラグを立てるという形でしょうか?
カテゴリを追加するごとにカラムをひとつ増やすという認識でよかったでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルの関数について教えて...
-
エクセルで最後の文字だけ置き...
-
#1136 - Column count doesn't ...
-
LEFT JOIN と GROUP BY
-
クエリ表示と、ADOで抽出したレ...
-
SQLにて特定の文字を除いた検索...
-
SQL Left Join で重複を排除す...
-
MySQLでエラーがでます
-
ある列の値を自動的にずらしたい
-
LAST_INSERT_IDで同時にアクセ...
-
updateを1行ずつ実行したい。
-
一つ前のレコードの値と減算し...
-
【Transact-sql】 execの結果を...
-
マイクラPC版のコマンドで効率...
-
副問合せの書き方について
-
データベース設計の図が判りづらい
-
Yahoo .comの idには年齢制限、...
-
Access パラメータクエリをcsv...
-
graphvizで到達矢印の位置を選...
-
ID毎に最新の値を取得する
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
エクセルの関数について教えて...
-
VIEWの元のテーブルのindexって...
-
エラー 1068 (42000): 複数の主...
-
SQLサーバから、項目の属性(型...
-
select文のwhere句に配列を入れ...
-
SQL Left Join で重複を排除す...
-
Access パラメータクエリをcsv...
-
マイクラPC版のコマンドで効率...
-
【Transact-sql】 execの結果を...
-
sqlで、600行あるテーブルを100...
-
SQLにて特定の文字を除いた検索...
-
1テーブル&複数レコードの更新...
-
PL/SQLの変数について
-
WordpressのContact form 7でzi...
-
複数テーブルのGROUP BY の使い...
-
inner joinをすると数がおかし...
-
バインド変数について
-
MySQLのint型で001と表示する方...
-
updateを1行ずつ実行したい。
おすすめ情報