![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
お世話になります。
商品データとカテゴリテーブルをそれぞれ分けたデータベースを作っており、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で質問しましょう!
似たような質問が見つかりました
- その他(データベース) pythonでsqlight勉強中、クエリー結果の利用法教えて下さい 1 2022/04/28 20:38
- Visual Basic(VBA) 【VBA】指定した検索条件に一致したら別シートに転記したい 2 2022/03/23 16:14
- 経営情報システム accessでの請求管理について 12 2022/06/11 16:20
- Excel(エクセル) Excel2016 行間を詰めたい&同じカテゴリなら上位2つだけを表示したい 5 2022/06/03 12:19
- Visual Basic(VBA) 【VBA】複数行あるカンマ区切りのデータを全て縦に一列に並べたい 5 2022/04/13 17:03
- Oracle SQL update方法 2 2022/06/22 14:07
- PostgreSQL 画像とカテゴリーを出力したいのですが、取得の条件を付ける方法がわかりません。 2 2022/05/01 18:03
- メルカリ PayPayフリマで商品をコンビニで発送している間に取引がキャンセルされてしまいました。 PayPa 1 2023/04/29 19:20
- MySQL 複数DBテーブルからのデータ取得 3 2022/05/17 15:02
- PostgreSQL PostgreSQL レコードからアイテム種類数を取得したい 2 2022/11/23 22:31
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
SQL Left Join で重複を排除す...
-
SQLサーバから、項目の属性(型...
-
select文のwhere句に配列を入れ...
-
MySQLのDATE型カラム値がNULLの...
-
VIEWの元のテーブルのindexって...
-
sqlで、600行あるテーブルを100...
-
VMware Player でCD-ROMドライ...
-
[MySQL] UNIQUE制約の値を更新...
-
「Duplicate entry '1' for key...
-
MySQLのint型で001と表示する方...
-
insertを高速化させたい
-
JOIN後同一名カラムから値がと...
-
ある条件の最大値+1を初番する...
-
エクセルの関数について教えて...
-
PL/SQLの変数について
-
入力値と外部キーをINSERTするには
-
時給毎の勤務時間を求めるSQL
-
MySQLでvarcharに先頭ゼロをセ...
-
ローカルルーターモードとは
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
副問合せの書き方について
-
SQLサーバから、項目の属性(型...
-
SQL Left Join で重複を排除す...
-
select文のwhere句に配列を入れ...
-
VIEWの元のテーブルのindexって...
-
PL/SQLの変数について
-
マイクラPC版のコマンドで効率...
-
エクセルの関数について教えて...
-
SQLにて特定の文字を除いた検索...
-
sqlで、600行あるテーブルを100...
-
Access パラメータクエリをcsv...
-
Unionした最後にGROUP BYを追加...
-
inner joinをすると数がおかし...
-
複数テーブルのGROUP BY の使い...
-
ある条件の最大値+1を初番する...
-
MySQLのint型で001と表示する方...
-
クエリ表示と、ADOで抽出したレ...
-
[MySQL] UNIQUE制約の値を更新...
-
テーブル名を省略して「h.id」...
おすすめ情報