2016-06-30 66 views
0

我有一個數組完整的ID和所有的ID是外鍵。我舉了一個我的表格的例子。我可以從SQL上的數組獲得多個外鍵嗎?

存儲表在我的數據庫是這樣的:

st_id store_name  tags 
st1  store1   ["t1","t2","t3"] 
st2  store2   ["t1","t4"] 
st3  store3   ["t3","t5"] 

變量表這樣

tag_id tag_name 
t1  tag1 
t2  tag2 
t3  tag3 
t4  tag4 
t5  tag5 

現在我必須選擇有T1標籤像所有的商店名稱:

t1 : st1, st2
t2 : st1
t3 : st1, st3

如何在數組中選擇多個外鍵?感謝所有的答案。

+1

這就是爲什麼在列中存儲逗號分隔值不是個好主意 – e4c5

+0

我同意e4c5,不這樣做 – PyNoob

+0

不好的做法。爲什麼不用標籤名稱和每個標籤所屬的「商店ID」創建一個單獨的表格......然後從那裏開始工作...... – andre3wap

回答

0

有些RDBMS對陣列的支持有限,但就我所知,MySQL並不是其中之一。

此數據歸一化的設計將是一個使用接線表像許多一對多的設計:

store table 
st_id store_name 
st1  store1 
st2  store2 
st3  store3 

store_tag table 
st_id tag_id 
st1  t1 
st1  t2 
st1  t3 
st2  t1 
st2  t4 
st3  t3 
st3  t5 


tag table 
tag_id tag_name 
t1  tag1 
t2  tag2 
t3  tag3 
t4  tag4 
t5  tag5 

然後,您可以用自己的代碼中的所有商店的列表做到這一點:

SELECT s.st_id, GROUP_CONCAT(t.tag_name) AS tags 
FROM store s 
JOIN store_tag st 
    ON st.st_id = s.st_id 
JOIN tag t 
    ON t.tag_id = st.tag_id 
GROUP BY st_id; 

或者,這如果你希望所有的商店具有特定標籤名稱的列表:

SELECT s.st_id 
FROM store s 
JOIN store_tag st 
    ON st.st_id = s.st_id 
JOIN tag t 
    ON t.tag_id = st.tag_id 
WHERE t.tag_name = 'tag1'; 
0

正如其他人所提到的,典型的方法是建立一個數據透視表。你的新的佈局會是這樣的:

Store表:

st_id store_name  
st1  store1   
st2  store2   
st3  store3   

標籤表:

tag_id tag_name 
t1  tag1 
t2  tag2 
t3  tag3 
t4  tag4 
t5  tag5 

tag_store(標籤對存儲數據透視表):

tag_id std_id 
std1  t1 
std1  t2 
std1  t3 
std2  t1 
std2  t4 
std3  t3 
std3  t5 

這將導致如下查詢 SELECT store_name,tag_name FROM store JOIN tag_store ON tag_store.std_id = store.id JOIN tag ON tag.tag_id = tag_store.tag_id;

如果你正在使用MySQL,您可以通過使用GROUP_CONCAT得到所有以每STORE_NAME一個列表標籤: SELECT STORE_NAME,GROUP_CONCAT(TAG_NAME分離器 '') 從商店的JOIN tag_store ON tag_store.std_id =店.id JOIN標記打開tag.tag_id = tag_store.tag_id GROUP BY store_name;

相關問題