Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 获取一对多关系中的所有子记录_Mysql_Sql_Coldfusion - Fatal编程技术网

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

Mysql 获取一对多关系中的所有子记录,mysql,sql,coldfusion,Mysql,Sql,Coldfusion,我正在为我的应用程序运行一个查询,这真的让我希望我使用ORM。我的表格结构如下: 标签 身份证件 名称 分类 田地 身份证件 标签 塔比德 您可以假设字段和选项卡之间存在一对多关系。我想做的是,如果可能的话,使用纯SQL创建一个包含选项卡的查询,每个选项卡下面显示所有字段的子查询 目前我正在做以下工作,但我想知道是否有更好的事情要做 <cfquery name="local.tabQuery" attributeCollection="#Variables.dsn#"> S

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

标签

身份证件 名称 分类 田地

身份证件 标签 塔比德 您可以假设字段和选项卡之间存在一对多关系。我想做的是,如果可能的话,使用纯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>

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

您需要分组输出

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

您肯定需要CFOUTPUT组feature,但我认为您可能希望在查询中加入一个join。除非有什么我看不到的,否则在循环的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
然后根据tab name字段使用groupcfoutput子句

如果始终希望显示所有选项卡,即使其中没有字段,也要将联接设置为左外部联接。下面是一个使用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可能会以您不期望的方式将事物组合到一个组中


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

谢谢邓肯。我原以为我可以使用cfouput group,但我用错了。如果您有与“sort”值相同的记录-两个都是sort=3-那么CF会将这些记录折叠成一个组,而这可能不是您想要的。您分组的列需要按查询的顺序排列。实际上,它不。。。。如果存在隐式排序,那没关系。根据分组的列对记录进行排序与在SQL ORDER by子句中明确指定字段之间存在差异。请参阅上面我发布的附加示例。
<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>