逗号分隔值

时间:2009-03-30 10:17:24

标签: sql mysql

如何使用mysql获取此查询?

表1:

id : nos

1   12,13,14
2   14
3   14,12

表2:

id : values

12   PHP
13   JAVA
14   C++

现在,我想要这样的输出:

1   PHP, JAVA, C++
2   C++
3   C++, PHP

5 个答案:

答案 0 :(得分:9)

未经测试,但它应该是这样的:

SELECT table1.id, GROUP_CONCAT(table2.values)
FROM table1 INNER JOIN table2 ON FIND_IN_SET(table2.id, table1.nos)
GROUP BY table1.id

答案 1 :(得分:3)

我无法在SQL中实现这一点。您应该使用1到N的关系来表示这些列表。类似的东西:

表1 :(仅ids)

  • 1
  • 2
  • 3

表1.1 :(将ID映射到列表中的值)

  • 1,12
  • 1,13
  • 1,14
  • 2,14
  • 3,14
  • 3,12

答案 2 :(得分:1)

不确定这是否适用于mySQL,但在SqlServer中你可以创建一个函数:

create function dbo.replaceIdsWithValues
(
    @inIds varchar(50)
)
returns varchar(50)
as
begin
    declare @ret as varchar(50)
    set @ret = @inIds
    select @ret = replace(@ret,cast(id as varchar),theValues) from t2
    return @ret
end

然后只需致电:

select id, nos, dbo.replaceIdsWithValues(nos) from t1 

假设您的表结构:

create table t1 (id int, nos varchar(50))
create table t2 (id int, theValues varchar(50))

您可以测试完整示例

create table t1 (id int, nos varchar(50))
create table t2 (id int, theValues varchar(50))
insert into t1(id, nos)
select 1, '12,13,14'
union all select 2, '14'
union all select 3, '14,12'

insert into t2(id, theValues)
select 12, 'PHP'
union all select 13, 'JAVA'
union all select 14, 'C++'

select id, nos, dbo.replaceIdsWithValues(nos) from t1 

答案 3 :(得分:0)

将此作为评论,但它变得越来越长。

SoulMerge回答(+1)特定于MySql,这个问题是初步意图。请参阅初始问题的编辑。

似乎问题再次被编辑为MY-SQL,但无论如何。

虽然您可以在MS SQL by using PATINDEX中实现这一点,但我不确定您是否可以在oracle中执行此操作。

我认为按照jo227o-da-silva(+ 1)的建议重组表格会更好。

答案 4 :(得分:0)

虽然与主题(MySQL)不完全相关,但是会帮助其他人按标题查找问题,但在MSSQL服务器中,可以使用FOR XML提示和一些讨厌的字符串替换来实现。

当我找到它时,我会发布一些代码......