基于相关表的查询结果的混淆查询结果

时间:2019-09-09 23:09:48

标签: mysql sql coldfusion cfquery

我正在查询表以获取所有可用记录。结果有一个名为ticket_id的主键

 <cfquery name="get_all_active_tickets">
  SELECT *
  FROM service_ticket
  where technician_id != <CFQUERYPARAM Value="#techID#"> AND technician_name != "" 
</cfquery>

查询返回42条唯一记录,每条记录的列ticket_id具有唯一值。

然后,我想查询另一个表以查找也包含主键ticket_id的所有记录,并对这些相关记录的那些结果中的列service_qty求和。我的目标是为包含相同ticket_id值的记录求和service_qty的所有值,并比较这些值。

我正在尝试这样做:

<cfset IDs = valueList(get_all_active_tickets.ticket_id) >
<cfquery name="high_hours_tickets">
    select SUM(service_qty) as total, ticket_id
    from service_ticket_detail
    where ticket_id in (<cfqueryparam cfsqltype="cf_sql_integer" value="#IDs#" list="true">)
</cfquery>

但是结果不符合预期。查询“ high_hours_tickets”的记录计数仅为1,它看起来像是对所有返回的记录总计了“ service_qty”列,而不仅仅是具有相同ticket_id值的记录。

我该如何解决?谢谢。


一种有效的解决方案,这要归功于Ageax在以下方面的贡献:

<cfset IDs = valueList(get_all_active_tickets.ticket_id) >
<cfquery name="high_hours_tickets" datasource="#datasource#">        
    SELECT t.ticket_id, SUM( d.service_qty) AS totalQty
    FROM   service_ticket t 
    INNER JOIN service_ticket_detail d ON d.ticket_id = t.ticket_id
    WHERE   t.technician_id <> <cfqueryparam value="#techID#" cfsqltype="cf_sql_integer"> 
    AND     t.technician_name <> "" 
    GROUP BY t.ticket_id
    HAVING  SUM( d.service_qty) > 2
</cfquery>

<cfoutput><cfset lstIDs = ValueList(high_hours_tickets.ticket_id) /></cfoutput>

<cfquery name="flagged_tickets" datasource="#datasource#">
    select * 
    from service_ticket
    where ticket_id IN ( 
        <cfqueryparam 
            value="#lstIDs#" 
            cfsqltype="CF_SQL_INTEGER"
            list="yes" 
            /> 
    )
</cfquery>

1 个答案:

答案 0 :(得分:3)

更新

由于表结构和期望的结果存在一些混淆,因此我根据您的描述将SQL Fiddle组合在一起。这是共享模式和示例数据的好工具,并且有助于避免查询问题引起很多麻烦:-)我不知道您使用的是哪个版本的MySQL,因此我假设使用的是旧版本最佳兼容性。

如果我理解正确,那么我们的目标是显示所有service_ticket记录,并具有 overall service_qty>2。为此,请使用子查询来求和将service_qty值乘以ticket_id,并删除所有<=2。然后将这些结果重新返回到主票证表以获取详细信息(名称,地址等)。 / p>

SQL Fiddle

查询:

SELECT t.ticket_id
       , t.address
       , t.name
       -- ... additional columns
       , total.qty
FROM   service_ticket t INNER JOIN 
          (
             SELECT   ticket_id
                     , SUM( service_qty) AS Qty
             FROM   service_ticket_detail 
             GROUP BY ticket_id
             HAVING  Qty > 2
          ) 
          total ON total.ticket_id = t.ticket_id
WHERE   t.technician_id <> <cfqueryparam value="#techID#" cfsqltype="cf_sql_integer"> 
AND     t.technician_name <> '' 

原始

忘记单独的查询。这是JOIN的工作。它们就是为此目的而设计的。

SELECT t.ticket_id, SUM( d.service_qty) AS totalQty
FROM   service_ticket t 
        INNER JOIN service_ticket_detail d ON d.ticket_id = t.ticket_id
WHERE   t.technician_id <> <cfqueryparam value="#techID#" cfsqltype="cf_sql_integer"> 
AND     t.technician_name <> ''
GROUP BY t.ticket_id
HAVING  SUM( d.service_qty) > 2

IMO,JOIN必不可少。如果您不熟悉它们,我强烈建议您阅读一些introductory tutorials on JOIN's。您会很高兴的。