2010-05-03 54 views
1

我有兩張表格,一個用於listings,另一個表示listings表格的tags列表。將MySQL行條目合併到一行中

listings表中,標記ID存儲在名爲tags的字段中,作爲1-2-3-。這對我來說非常好(正則表達式和連接來分隔和顯示數據),但是現在我需要將這些標記的標題拖到單行中。見下文。

listings table 
id tags 
1  1-2-3- 
2  4-5-6- 


tags table 
id title 
1  pig 
2  dog 
3  cat 
4  mouse 
5  elephant 
6  duck 

而我需要製作出listings表的是:

id  tags 
2  mouse, elephant, duck 

回答

1

下面是一個查詢,可以幫助。但由於它正在做一些字符串操作,它可能不如常規連接:

select l.id, group_concat(t.title) 
    from listings l, tags t 
    where concat('-', l.tags) like concat('%-', t.id, '-%') group by l.id ; 
+0

謝謝,這是完美的,正是我所需要的。 – 2010-05-04 16:17:48

+0

我的版本從您的版本: SELECT l.id,GROUP_CONCAT(t.title) FROM listing l,tags t WHERE l.tags REGEXP CONCAT('[[:<:]]',t.id,' [[:>:]]') GROUP BY l.id; – 2010-05-04 16:35:36

0

GROUP_CONCAT()+ INNER JOIN + GROUP BY

+0

這對單行結果很好,我試圖讓它與多行工作。 – 2010-05-04 12:08:56

1

不幸的是,存儲在這個非規範化格式的標籤,從1-2-3到相應的標籤沒有簡單的方法。換句話說,沒有簡單的方法來拆分ID,加入到另一個表,然後重新組合。你最好的選擇是創建一個listing_tag表有兩列

listing_id tag_id 
1    1 
1    2 
1    3 
2    4 
2    5 
2    6 

,然後它只是一個簡單的連接:

SELECT listing_id, GROUP_CONCAT(title SEPARATOR ', ') FROM listing_tag JOIN tags ON tags.id = tag_id 
+0

但現在你坐在列表中的多個條目? – 2010-05-04 07:50:18

+0

@德里克,是的,這確實複製了一些數據,但它遵循一個完善的規範化實踐,使許多其他事情變得更加簡單:http://en.wikipedia.org/wiki/First_normal_form – 2010-05-04 16:18:31