2013-06-04 116 views
0

我已經搜索周圍,並沒有什麼東西。MYSQL加逗號分隔查詢

我有2個表,並不必爲每個帖子查詢數據庫,顯示我需要加入他們一些如何。

我想從圖片表中獲得字段的id的url。現在繼承人我的問題:pics字段是一個由恩斯分隔的「列表」(4,1或32,4,32,2),因爲每個帖子通常都有多個圖片。

表設置窗口:

帖子:

id | header | text | pics 
| 1  xxx  xxx 3,1  
| 2  xxx  xxx 2,10,4  
| 3  xxx  xxx 16,17,18,19  
| 4  xxx  xxx 11,12,13   

圖片:

id | name | url 
| 1 xxx xxx  
| 2 xxx xxx   
| 3 xxx xxx   
| 4 xxx xxx   
| 10 xxx xxx   
| 11 xxx xxx   
| 12 xxx xxx     
| 13 xxx xxx   
| 16 xxx xxx   
| 17 xxx xxx   
| 18 xxx xxx   
+9

你爲什麼要保存,你需要加入一個逗號分開的名單?請規範化表結構。 – Taryn

+5

第1步:重新設計表格,使其正確歸一化。步驟2)在規範化之後,使用普通的常規JOIN查詢。 –

+2

'pics' CSV列表可以做一個單獨的表格,規範化數據。如果圖片只出現在單個帖子中,爲'pics'表添加'post_id'鍵就足夠了。 – Orbling

回答

6

強烈建議您修復當前的數據庫結構這樣你就不會存儲在數據一個逗號分隔的列表。您應該構建您的表類似於以下內容:

CREATE TABLE posts 
    (`id` int, `header` varchar(3), `text` varchar(3)) 
; 

CREATE TABLE pics 
    (`id` int, `name` varchar(3), `url` varchar(3)) 
; 

CREATE TABLE post_pics 
    (`post_id` int, `pic_id` int) 
; 

然後,您可以通過連接表很容易地得到一個結果:

select p.id, 
    p.header, 
    p.text, 
    c.name, 
    c.url 
from posts p 
inner join post_pics pp 
    on p.id = pp.post_id 
inner join pics c 
    on pp.pic_id = c.id; 

SQL Fiddle with demo

如果你不能改變你的表,那麼你應該能夠使用FIND_IN_SET查詢:

select p.id, p.header, p.text, p.pics, 
    c.id c_id, c.name, c.url 
from posts p 
inner join pics c 
    on find_in_set(c.id, p.pics) 

SQL Fiddle with Demo

編輯,如果你想要數據顯示爲逗號分隔列表,那麼你可以使用GROUP_CONCAT

查詢1:

select p.id, 
    p.header, 
    p.text, 
    group_concat(c.name separator ', ') name, 
    group_concat(c.url separator ', ') url 
from posts p 
inner join post_pics pp 
    on p.id = pp.post_id 
inner join pics c 
    on pp.pic_id = c.id 
group by p.id, p.header, p.text; 

SQL Fiddle with Demo

查詢2:

select p.id, p.header, p.text, p.pics, 
    group_concat(c.name separator ', ') name, 
    group_concat(c.url separator ', ') url 
from posts p 
inner join pics c 
    on find_in_set(c.id, p.pics) 
group by p.id, p.header, p.text, p.pics; 

SQL Fiddle with Demo

+0

謝謝爲你的快速響應,但在這兩種情況下,它返回每個圖片的ALL(標題,文本,URL等)。在你的第一個小提琴中,有兩個1和樹3等。我接受了你的建議並按照你的建議構建了我的數據庫,但是我需要將所有網址都放在一行中。 –

+0

你想要的結果是什麼?如果您希望數據以逗號分隔的列表顯示,請參閱使用'group_concat'進行編輯。 – Taryn

+0

是的,我在谷歌周圍看了一下,但我努力得到它的工作。但你的代碼幫助了我,非常感謝我的問題解決了。 –