2015-04-07 58 views
0

我有两个表,其中一个拥有多个ID作为管道分隔的字符串,另一个拥有每个ID的名称。我想将名称连接为\ n之间的单行字符串名称。从管道分隔的字符串获取多个ID来连接来自另一个表的数据

表:

标识表

| StringIds | 

'1|2|3|4|5|4|1' 

名称表

| StringId | String Name | 

    1  'One' 

    2  'Two' 

    3  'Three' 

    4  'Four' 

    5  'Five' 

我试着用下面的代码没有任何成功:

SELECT GROUP_CONCAT(StringName || '\n') 
FROM Names 
WHERE 
    StringId 
    IN 
    (
     SELECT DISTINCT 
     GROUP_CONCAT(REPLACE(StringIds,'|',',')) 
     FROM Ids 

) ORDER BY字符串名称ASC

预期输出: '一个' \ n'Two '\ n'Three' \ n'Four '\ n'Five' \ n

Fiddle

回答

1

的问题是,你已经使用的子查询

SELECT DISTINCT 
    group_concat(replace(StringIds,'|',',')) 
    FROM Ids 

实际上重新如预期的那样变成字符串'1,2,3,...'不是数字列表1,2,3,...

WHERE StringId IN ((SELECT...))将无法​​使用字符串,它需要一个元素列表和字符串是一个元素。

所以相反,你将不得不看看字符串函数,在那里你可以使用INSTR(X,Y)函数来查找StringId。

但是在这里我们必须注意,因为如果i.E.我们到哪里寻找 数量3那么我们会发现它在:

1,2,3,4 

,但它也将发现它在

1,2,30,4 

因此,关键是要环绕的查询字符串分隔 和搜索字符串。因此,如果我们要搜索',3,',',1,2,3,4,' ,我们会按预期匹配,如果我们搜索',1,2,30,4,',那么我们将不匹配,这也是预期的。因此,这是我们在我们的查询:)

SELECT group_concat(StringName || '\n') as AllNames 
FROM Names 
WHERE INSTR(
    (',' || (
    SELECT DISTINCT 
     group_concat(replace(StringIds,'|',',')) 
    FROM Ids 
) || ','), 
    (',' || StringId || ',') 
) > 0 
ORDER BY StringName ASC; 

那么这些奇怪的concats现在,如果我们考虑一下它的原因,因为我们是在一个字符串搜索, 我们不妨用你的oringinal字符串,而不是提前将它的 :

SELECT group_concat(StringName || '\n') as AllNames 
FROM Names 
WHERE INSTR(
    ('|' || (
    SELECT StringIds FROM Ids LIMIT 1 
) || '|'), 
    ('|' || StringId || '|') 
) > 0 
ORDER BY StringName ASC; 

而实际上还有很多方面,我们可以做到这一点。让我给你使用LIKE比较,而不是INSTR功能的最后一个版本:

SELECT group_concat(StringName || '\n') as AllNames 
FROM Names 
WHERE 
    ('|' || (
    SELECT StringIds FROM Ids LIMIT 1 
) || '|') 
    LIKE 
    ('%|' || StringId || '|%') 
ORDER BY StringName ASC; 

希望此链接,这样你就可以Fiddle around here

UPDATE

如果你最终不得不在多个条目您的ID表,并且您想要打印出Ids表中每个条目的唯一名称,那么您必须扭转查询:

SELECT 
(SELECT group_concat(StringName || '\n') 
    FROM Names 
    WHERE 
    ('|' || (
     StringIds 
    ) || '|') 
    LIKE 
    ('%|' || StringId || '|%') 
    ORDER BY StringName ASC 
) as AllNames FROM Ids 

现在这里Ids是循环的外部表,并且对于每个条目执行子查询,该查询返回AllNames值。

+0

谢谢..最后一个选项是否会工作,即使它是几行stringname的引用相同的字符串? – Henrik

+0

@Henrik不用担心,即使您在StringIds中有三次15次,理论上它也会匹配15次,但是您从名称中选择,因此它将检查StringId是否为StringId,因此不会选择重复项 –

+0

@Henrik如果这对你有帮助,请将问题标记为已回答! –

相关问题