在Excel中格式化mysql数据

我有一个MySQL的表中,像这样:

+-------+--------+-------------+ | child | parent | data | +-------+--------+-------------+ | 1 | 0 | house | | 2 | 0 | car | | 3 | 1 | door | | 4 | 2 | door | | 5 | 2 | windscreen | | 11 | 5 | wiper | +-------+--------+-------------+ 

我根据本教程从excel 2007连接到mysql,除了我在系统dns中创build了不在用户dns中的dns,这对我很有用。

我有一点关于公式的知识,我不知道如何获得这个表格数据:

 house | door house | wall car | door car | windscreen | wiper 

编辑1

带有mysql的部分在这里不是一个问题。 那个mysql表格可能是一个excel表格。

编辑2

现在我意识到,甚至没有必要说这里只有一个MySQL表格。 但这可能会启发/帮助某人。

编辑3

一些文件后,我设法解决我的问题的最重要的方面

工作表db中的范围:

 child parent data 1 0 car 2 0 house 3 1 door 4 2 door 5 1 window 6 2 window 7 1 windscreen 8 7 wiper 9 4 color 10 2 color 

我有一个名字数据库引用

 =db!$A$2:OFFSET(db!$C$2,COUNTA(db!$C:$C)-2,0) 

一个名字的孩子

 =db!$A$2:OFFSET(db!$A$2,COUNTA(db!$A:$A)-2,0) 

在另一个名称构造表中,我从B2开始,使用下面的公式:

 =IFERROR( IF(ISBLANK(B1), LARGE(child,COUNTA($A$2:A$2)+1), VLOOKUP(B1,db,2,0) ),".") 

在名为output的第三个表格中,我从A1开始,使用公式:

 =IFERROR(VLOOKUP(construct!B2,db,3,0),".") 

现在最后一个挑战是当新的条目被添加到主表中时,从构造和输出中的公式可以自动消耗,但我认为是不可能的。

编辑4

当从数据库表中的SQL导入将有一个表而不是范围,所以公式会看起来有点不同。 单击表格中的任意位置,单击devise选项卡并重命名表格基础,然后从b2开始使用以下公式构build工作表:

 =IFERROR( IF(ISBLANK(B1), LARGE(INDIRECT("base[child]"),COUNTA($A$2:A$2)+1), VLOOKUP(B1,base,2,0) ),".") 

以下是我将如何使用VBA:首先创build一个类模块并将其命名为CDatum。 把这个代码放在那里。

 Option Explicit Private msID As String Private msData As String Private msParentID As String Public Property Get ID() As String ID = msID End Property Public Property Let ID(ByVal sID As String) msID = sID End Property Public Property Get Data() As String Data = msData End Property Public Property Let Data(ByVal sData As String) msData = sData End Property Public Property Get ParentID() As String ParentID = msParentID End Property Public Property Let ParentID(ByVal sParentID As String) msParentID = sParentID End Property Public Property Get ChildCount() As Long Dim i As Long Dim lReturn As Long For i = 1 To gclsData.Count If gclsData.Data(i).ParentID = Me.ID Then lReturn = lReturn + 1 End If Next i ChildCount = lReturn End Property Public Property Get Tree() As Variant Dim vaReturn As Variant Dim vaChild As Variant Dim i As Long, j As Long Dim lChildCount As Long Dim lRowCount As Long Dim lOldUbound As Long If Me.ChildCount = 0 Then lRowCount = 1 Else lRowCount = Me.ChildCount End If ReDim vaReturn(1 To lRowCount, 1 To 1) For i = 1 To lRowCount vaReturn(i, 1) = Me.Data Next i For i = 1 To gclsData.Count If gclsData.Data(i).ParentID = Me.ID Then lChildCount = lChildCount + 1 vaChild = gclsData.Data(i).Tree lOldUbound = UBound(vaReturn, 2) ReDim Preserve vaReturn(1 To lRowCount, 1 To UBound(vaReturn, 2) + UBound(vaChild, 2)) For j = 1 To UBound(vaChild, 2) vaReturn(lChildCount, j + 1) = vaChild(1, j) Next j End If Next i Tree = vaReturn End Property 

接下来创build一个类模块并将其命名为CData,并将其放入其中

 Option Explicit Private mcolCDatas As Collection Private Sub Class_Initialize() Set mcolCDatas = New Collection End Sub Private Sub Class_Terminate() Set mcolCDatas = Nothing End Sub Public Sub Add(clsDatum As CDatum) mcolCDatas.Add clsDatum, clsDatum.ID End Sub Public Property Get Count() As Long Count = mcolCDatas.Count End Property Public Property Get Data(vItem As Variant) As CDatum Set Data = mcolCDatas.Item(vItem) End Property Public Property Get FilterByTopLevel() As CData Dim clsReturn As CData Dim i As Long Dim clsDatum As CDatum Set clsReturn = New CData For i = 1 To Me.Count Set clsDatum = Me.Data(i) If clsDatum.ParentID = 0 Then clsReturn.Add clsDatum End If Next i Set FilterByTopLevel = clsReturn End Property 

接下来插入一个标准模块,并把这个代码放在里面

 Option Explicit Public gclsData As CData Sub FillClass() Dim clsDatum As CDatum Dim rCell As Range Set gclsData = New CData For Each rCell In Sheet1.Range("A2:A7").Cells Set clsDatum = New CDatum clsDatum.ID = rCell.Value clsDatum.Data = rCell.Offset(0, 2).Value clsDatum.ParentID = rCell.Offset(0, 1).Value gclsData.Add clsDatum Next rCell End Sub Sub PrintTree() Dim clsDatum As CDatum Dim clsTopLevel As CData Dim i As Long Dim ws As Worksheet Dim vaData As Variant Dim lRowCount As Long FillClass Set clsTopLevel = gclsData.FilterByTopLevel Set ws = ThisWorkbook.Worksheets.Add lRowCount = 1 For i = 1 To clsTopLevel.Count Set clsDatum = clsTopLevel.Data(i) vaData = clsDatum.Tree ws.Cells(lRowCount, 1).Resize(UBound(vaData, 1), UBound(vaData, 2)).Value = vaData lRowCount = lRowCount + UBound(vaData, 1) Next i End Sub 

然后运行PrintTree子。 或者你可以下载我用来testing它的工作簿,并在其中继续。

http://www.dailydoseofexcel.com/excel/TestDataClass.zip

首先,您是否必须使用该连接才能将数据传送到Excel? 因为如果您只是将数据本身导出到一个.csv文件,然后可以直接使用Excel打开,那将会非常简单。

给它一个: SELECT * FROM ... INTO OUTFILE '/temp.csv' FIELDS ESCAPED BY '""' TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n';

关于你的查询,看起来你试图映射一棵树。 看看下面的网站:

  1. SQL数据库中的树
  2. SQL中的树层次结构
  3. SQLgraphicsalgorithm