1 回答

TA貢獻(xiàn)1850條經(jīng)驗(yàn) 獲得超11個(gè)贊
不要在一行中存儲(chǔ)多個(gè)值。不要將數(shù)字存儲(chǔ)為字符串。
產(chǎn)品和組合之間存在多對(duì)多關(guān)系:每個(gè)產(chǎn)品可能出現(xiàn)在多個(gè)組合中,每個(gè)組合可能包含許多產(chǎn)品。從規(guī)范化的角度來看,表示它的正確方法是創(chuàng)建另一個(gè)表,稱為橋接表,以存儲(chǔ)關(guān)系。
create table product_combo (
? ? product_id int references product(product_id),
? ? combo_id int references combo(combo_id),
? ? primary key (product_id, combo_id)
);
對(duì)于您的示例數(shù)據(jù),橋接表將包含:
product_id? ? combo_id
1? ? ? ? ? ? ?1
1? ? ? ? ? ? ?2
1? ? ? ? ? ? ?3
1? ? ? ? ? ? ?4
2? ? ? ? ? ? ?2
2? ? ? ? ? ? ?4
3? ? ? ? ? ? ?1
3? ? ? ? ? ? ?2
4? ? ? ? ? ? ?1
4? ? ? ? ? ? ?4
有了這個(gè)設(shè)置,假設(shè)你想選擇一個(gè)給定的組合及其所有相關(guān)產(chǎn)品,那么你會(huì)去:
select c.*, p.*
from combos c
inner join product_combos pc on pc.combo_id = c.combo_id
inner join products p on p.product_id = pc.product_id
where c.combo_id = ?
如果您真的想要,您甚至可以為每個(gè)組合重建產(chǎn)品的 csv 列表:
select c.combo_id, c.combo_name, group_concat(p.product_name) product_names
from products p
inner join product_combos pc on pc.product_id = p.product_id
inner jon combos c on c.combo_id = pc.combo_id
group by c.combo_id, c.combo_name
- 1 回答
- 0 關(guān)注
- 106 瀏覽
添加回答
舉報(bào)