お世話になります。
商品データとカテゴリテーブルをそれぞれ分けたデータベースを作っており、JOINで該当カテゴリ名を抽出しています。
しかし商品によって複数のカテゴリに属する(カンマ区切りで「1,2,3」というように現状格納しています)場合、それらのすべてを拾ってくることは可能でしょうか?
またカテゴリひとつひとつに対して商品データ内にカラムを用意するべきでしょうか?
select `shop`.no, left outer join list_category on `shop`.category=`list_category`.no (現状)
どうぞよろしくお願い致します。
No.1
- 回答日時:
>カンマ区切りで「1,2,3」
カテゴリー=商品テーブルをつくってきちんと正規化する方が
データ管理はしやすいとおもいますよ
この方式でどうしてもやりたいなら
「,1,2,3,」と先頭と末尾にもカンマをつけて
カテゴリーテーブルと組み合わせるとき
商品テーブルのカラム like concat(',',カテゴリーテーブルのカラム,',')
のようにすることです
この回答への補足
早速の解答ありがとうございます。
やはりテーブルを設けた方が良いのですね。
例えば対応言語でカテゴリ分けする場合、日本語や英語でそれぞれフラグを立てるという形でしょうか?
カテゴリを追加するごとにカラムをひとつ増やすという認識でよかったでしょうか?
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.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.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秒ほどで驚きです!
お探しの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で、600行あるテーブルを100...
-
書籍の内容はまともでしょうか?
-
SQLサーバから、項目の属性(型...
-
阪急三番街 ATM(ゆうちょ)は...
-
【MySQL】本当に困っているので...
-
DataTableで重複行を削除したい
-
SQL Left Join で重複を排除す...
-
Unionした最後にGROUP BYを追加...
-
1対多結合で多を絞り込み条件と...
-
php+mysqlで複数選択削除について
-
PL/SQLの変数について
-
[MySQL] UNIQUE制約の値を更新...
-
LAST_INSERT_IDで同時にアクセ...
-
Access パラメータクエリをcsv...
-
画像とカテゴリーを出力したい...
-
マイクラPC版のコマンドで効率...
-
Mysql でレコードを追加した時...
-
VMwareがCDドライブを認識する...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
SQL Left Join で重複を排除す...
-
副問合せの書き方について
-
SQLサーバから、項目の属性(型...
-
VIEWの元のテーブルのindexって...
-
select文のwhere句に配列を入れ...
-
selectした大量データをinsert...
-
センノシド異性体構造式
-
Unionした最後にGROUP BYを追加...
-
insertを高速化させたい
-
SQLにて特定の文字を除いた検索...
-
マイクラPC版のコマンドで効率...
-
ある条件の最大値+1を初番する...
-
inner joinをすると数がおかし...
-
sqlで、600行あるテーブルを100...
-
エクセルの関数について教えて...
-
Access パラメータクエリをcsv...
-
URL と行番号の指定
-
複数テーブルのGROUP BY の使い...
-
PL/SQLの変数について
おすすめ情報