mysql - Coldfusion 查询结果基于相关表的查询结果

标签 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 和 SUM 这些结果中名为 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>

最佳答案

更新:

由于对表结构和预期结果有些困惑,我整理了一个 SQL Fiddle根据你的描述。它是共享模式和示例数据的好工具,有助于避免大量的查询问题 :-) 我不知道你使用的是哪个版本的 MySQL,所以我假设一个旧版本最佳兼容性。

如果我没理解错的话,目标是显示所有 service_ticket 记录,overall service_qty > 2. 要做到这一点,使用子查询按 ticket_idservice_qty 值求和,并删除任何 <= 2 的值。然后将这些结果连接回主工单表以获取详细信息(姓名、地址等...)。

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 .你会很高兴你做到了。

关于mysql - Coldfusion 查询结果基于相关表的查询结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57862166/

相关文章:

mysql - 确定基于单个值选择哪些索引

mysql - 如何在 MySQL 中对从开始到指定日期的总计进行 SELECT?

ColdFusion 结构直接赋值与对象文字表示法

mysql - cfc 和 mySQL 中的 coldfusion 查询中的日期时间异常

mysql - 无法在 kubernetes 数据库中添加 .sql 文件

php - 如何在 Codeigniter 中转义特殊字符

python - 使用 python 解析 SQL 以提取列名和表名

flash - 在 ColdFusion 9 中使用 Flash 表单时出现 JavaScript 错误

mysql - 为什么 NHibernate 不支持在 MySql 上进行批处理

java - 使用 Java 的多个 SQL 查询(效率)