2010-10-25 65 views
3

我有一个MySQL的结果集像波纹管编号MySQL的结果行

id  name 
--------------------- 
1   abc 
1   abc 
2   xyz 
2   xyz 
3   pqr 

现在我需要修改结果集,这样它会像如下:

id  name 
--------------------- 
1   abc-1 
1   abc-2 
2   xyz-1 
2   xyz-2 
3   pqr 

摘要是我需要编号名称列从结果集和编号将只适用于行有mor e比结果集中的一个值

那么将会是什么MySQL 选择查询

+2

你试过了什么? – codaddict 2010-10-25 10:20:44

+0

您是否需要实际修改表格上的数据或仅查询结果。无论哪种方式,这将有助于查看您的实际表结构和/或您已经使用的查询来选择数据。 – Spudley 2010-10-25 10:26:12

+0

这是查询结果。我不需要修改数据。我只需要SELECT查询, – 2010-10-25 10:28:25

回答

2

这可能工作,但可能有,我不能想现在

set @i = 0; 

select 
f.id, 
@i:[email protected]+1 as i, 
case 
    when c.counter <= 1 then f.name 
    else concat(f.name,'-',(@i % c.counter) +1) 
end as name 
from 
foo f 
join (select id, count(*) as counter from foo group by id) c on c.id = f.id 
order by 
f.id,name; 

编辑一个更好的方式:在上述评论指出,更好的在应用程序级对要做到这一点db

+1

case可以用if替换,变量可以声明为(select @i:= 0)我在FROM子句中 – ksogor 2010-10-25 10:48:33

+1

@ksogor - 好点 – 2010-10-25 10:49:40

+0

这真的很有帮助,但是在我的查询中有一个左连接使得结果集变得复杂。还没有得到期望的结果。 :( – 2010-10-25 11:16:27

2

我看到3层可能的方法来解决此问题:

  1. 更新中DB一旦所有的值,然后检查每个插入/更新/删除,编号是否有更新。据我所知,这可以通过程序,使用数据库或触发器来完成

  2. 使用SQL查询生成编号 - 这将需要在id,组结果和计数行数类似的ID。这将看下面的方式: select t1.id, t1.name, count(t2.id) from t1, t2 where t1.id = t2.id group by t2.id (顺便说一句,这个查询可能需要O(N^2)时间,这是大表长) 然后,你将不得不分析第三列,并得到最终结果。

  3. 通过编程语言对结果进行后处理。这看起来像是最简单和有效的解决方案。

+2

对于选项3,这看起来不像是在SQL中值得做的事情;在调用程序中只有一个循环,它具有一个计数器变量,如果ID相同,则该计数器变量会增加,并在ID字段更改时重置。 – Spudley 2010-10-25 10:40:50