以一对多的关系获取所有子记录

时间:2011-03-02 16:39:31

标签: mysql sql coldfusion

我正在为我的应用程序运行查询,这真的让我希望我使用ORM。我的表格结构如下:

  

突片

     
      
  • ID
  •   
  • 名称
  •   
  • 排序
  •   
     

字段

     
      
  • ID
  •   
  • 标签
  •   
  • tabid
  •   

您可以假设字段和标签之间存在一对多的关系。我想做的是,如果可能的话,使用纯SQL创建一个包含选项卡的查询,每个选项卡下面都显示所有字段的子查询。

目前我正在做以下事情,但我想知道是否有更好的事情要做。

<cfquery name="local.tabQuery" attributeCollection="#Variables.dsn#">
     SELECT id,name FROM tabs ORDER BY sort
</cfquery>
<cfset local.tabs = [] />
<cfloop query="local.tabQuery">
     <cfquery name="local.fields" attributeCollection="#Variables.dsn3">
          SELECT * FROM fields WHERE tabid = <cfqueryparam value="#local.tabQuery.id#" cfsqltype="cf_sql_integer" />
     <cfquery>
     <cfset arrayAppend(local.tabs, local.fields) />
</cfloop>

注意:这不是我的实际代码,但理论上应该可以正常工作。

2 个答案:

答案 0 :(得分:2)

您想要分组输出。

<cfquery name="local.tabQuery" attributeCollection="#Variables.dsn#">
    SELECT t.id, t.name, t.sort, f.id AS fieldID, f.label
    FROM tabs t  INNER JOIN fields f ON t.id = f.tabID
    ORDER BY t.sort
</cfquery>

<cfoutput query="local.tabQuery" group="sort">
    Tab: #local.tabQuery.name#<br>

    <cfoutput>
        Field: #local.tabQuery.label#<br>
    </cfoutput>
</cfoutput>

答案 1 :(得分:0)

您肯定需要CFOUTPUT组功能,但我认为您可能希望在查询中加入。除非有一些我没有看到的东西,在循环CFOUTPUT或其他循环中运行辅助CFQUERY听起来像数据库服务器的很多工作。

怎么样?
SELECT T.id, T.name, F.id, F.label
FROM tabs T JOIN fields F ON F.tabid = T.id
ORDER BY T.sort, F.label

然后根据选项卡名称字段

使用组CFOUTPUT子句
<cfoutput query="local.tabQuery" group="name">
    Tab: #local.tabQuery.name#<br>

    <cfoutput>
        Field: #local.tabQuery.label#<br>
    </cfoutput>
</cfoutput>

如果您始终想要显示所有标签,即使您没有字段,也请将JOIN设为左外连接。以下是使用cfartgallery数据库的示例,该数据库应该内置到您的开发服务器中。它显示了所有艺术家和他们可能拥有的任何作品。

<cfquery name="qryArtistsWithWorks" datasource="cfartgallery">
    SELECT A1.artistID, A1.lastname || ', ' || A1.firstname as artistName,
                A2.artID, A2.artName, A2.description
    FROM artists A1 LEFT OUTER JOIN art A2 ON A2.artistID = A1.artistID
    ORDER BY artistName, A2.artName
</cfquery>


<cfoutput query="qryArtistsWithWorks" group="artistId">

    <dl>
        <dt>#qryArtistsWithWorks.artistName#</dt>

        <cfoutput>
        <dd>#qryArtistsWithWorks.artName#</dd>
        </cfoutput>

    </dl>
</cfoutput>

确保您分组的字段唯一标识您要构建的组(即没有两个记录具有相同的'sort'值)。您通常应该使用类似主键或标签字段的内容作为分组属性。如果不这样做,CF可能会以您不期望的方式将事物组合成一个组。

在上面的示例中,两位艺术家可能拥有相同的名字和姓氏,但他们的艺术作品不会折叠成一个列表。