2011-03-02 83 views
0

我正在为我的应用程序运行一个查询,这真的让我希望我使用了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

你想分组输出。

<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> 
+0

谢谢邓肯。我以为我可以使用cfouput组,但我错误地使用了它。 – 2011-03-02 16:51:15

+0

如果你有'排序'相同值的记录 - 两个有排序= 3 - 然后CF将它们合并成一个组,这可能不是你想要的。 – bpanulla 2011-03-03 17:51:44

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> 

如果你总是想显示所有选项卡,即使你没有在这一个领域,使加入一个左外部联接。以下是使用应该构建到开发服务器中的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> 

确保现场你组唯一标识要构建(即没有两个记录有“排序”相同的值)的组。通常应该使用诸如主键或标签字段之类的东西作为分组属性。如果你不这样做,CF可能会以你不期待的方式将事物分组成一个组。

在上面的例子中,两位艺术家可能有相同的名字和姓氏,但他们的作品不会被合并到一个列表中。

+1

您所属的专栏需要按照您的查询顺序排列 – duncan 2011-03-02 17:38:49

+0

它实际上并不......如果有隐含的订单正在进行,那没关系。按照您所分组的列排列的记录与SQL ORDER BY子句中的字段明确区分是有区别的。查看我上面发布的其他示例。 – bpanulla 2011-03-03 17:42:33

相关问题