2010-05-03 53 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