我有1个表,其中存储了类别。 例如:
CategoryId CategoryName
-------------------------------
1 General
2 dummy
3 test
现在我有另外一张表,我在其中存储文章,在该表中我用逗号分隔值存储文章ID,因为1篇文章可以在1个以上的类别中
ArticleID Content CategoryId
-------------------------------------------
1 Test 1,2
2 Test2 1,3
3 Test3 1,2,3
4 Test4 2
现在在我显示文章的前端我也要显示文章categoryname。
那么你能告诉我怎样才能实现这个目标?
输出应该像::
ArticleId Content Category
------------------------------------------
1 Test General,dummy
2 Test2 General,test
3 Test3 General,dummy,test
4 Test4 dummy
答案 0 :(得分:3)
也许您应该考虑更改数据模型。
创建一个额外的表Article_Category(ArticleID,CategoryID),并为文章所属的每个类别的每一篇文章添加一行。
然后查询成为三个表的简单连接。按文章和类别对输出进行排序,您可以轻松地“压缩”GUI中的输出。
答案 1 :(得分:0)
在MySQL中,您可以使用GROUP_CONCAT
聚合函数执行此操作。我不认为在T-SQL中有类似的东西,但你可以在搜索中使用它。以下是有人询问此问题的示例:http://social.msdn.microsoft.com/Forums/en/transactsql/thread/f09d4166-2030-41fe-b86e-392fbc94db53。
答案 2 :(得分:0)
如果你知道某些.NET,你可以创建类似StringAggregator的东西。你以前的问题表明你确实知道一些编程。
创建SQL Server 2005/2008项目并使用此代码
Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.Data.SqlTypes
Imports Microsoft.SqlServer.Server
Imports System.Collections.Generic
Imports System.IO
<Serializable()> _
<Microsoft.SqlServer.Server.SqlUserDefinedAggregate(Format.UserDefined, MaxByteSize:=8000)> _
Public Structure StringAggrComma
Implements IBinarySerialize
Private values As List(Of String)
Public Sub Init()
' Put your code here
values = New List(Of String)
End Sub
Public Sub Accumulate(ByVal value As SqlString)
' Put your code here
values.Add(value.Value.Trim)
End Sub
Public Sub Merge(ByVal value As StringAggrComma)
' Put your code here
For Each val As String In value.values
Accumulate(val)
Next
End Sub
Public Function Terminate() As SqlString
' Put your code here
Return New SqlString(String.Join(", ", values.ToArray))
End Function
Public Sub Write(ByVal w As System.IO.BinaryWriter) Implements Microsoft.SqlServer.Server.IBinarySerialize.Write
w.Write(values.Count)
For Each item As String In values
w.Write(item)
Next
End Sub
Public Sub Read(ByVal r As System.IO.BinaryReader) Implements Microsoft.SqlServer.Server.IBinarySerialize.Read
values = New List(Of String)
For i As Int32 = 0 To r.ReadInt32
values.Add(r.ReadString)
Next
End Sub
End Structure