Coldfusion Query results based on query results from a related table 查询结果
Colfusion Query results based on query results from a related table
我正在查询 table 以获取所有可用记录。结果有一个名为 ticket_id
的主键
<cfquery name="get_all_active_tickets">
SELECT *
FROM service_ticket
where technician_id != <CFQUERYPARAM Value="#techID#"> AND technician_name != ""
</cfquery>
查询returns 42条唯一记录,每条记录在ticket_id
列都有一个唯一值。
然后我想查询另一个 table 以获取所有还包含主键 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>
更新:
由于对 table 结构和预期结果有些困惑,我根据您的描述整理了一个 SQL Fiddle。它是共享模式和样本数据的好工具,有助于避免大量的查询问题 :-) 我不知道你使用的是哪个版本的 MySQL,所以我假设旧版本以获得最佳兼容性。
如果我理解正确,目标是显示所有 service_ticket
记录,总体 service_qty
> 2。要做到这一点,使用子查询对 service_qty
值求和 ticket_id
,并删除任何 <= 2 的值。然后将这些结果加入主票 table 以获取详细信息(名称,地址等...)。
查询:
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。你会很高兴你做到了。
我正在查询 table 以获取所有可用记录。结果有一个名为 ticket_id
的主键 <cfquery name="get_all_active_tickets">
SELECT *
FROM service_ticket
where technician_id != <CFQUERYPARAM Value="#techID#"> AND technician_name != ""
</cfquery>
查询returns 42条唯一记录,每条记录在ticket_id
列都有一个唯一值。
然后我想查询另一个 table 以获取所有还包含主键 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>
更新:
由于对 table 结构和预期结果有些困惑,我根据您的描述整理了一个 SQL Fiddle。它是共享模式和样本数据的好工具,有助于避免大量的查询问题 :-) 我不知道你使用的是哪个版本的 MySQL,所以我假设旧版本以获得最佳兼容性。
如果我理解正确,目标是显示所有 service_ticket
记录,总体 service_qty
> 2。要做到这一点,使用子查询对 service_qty
值求和 ticket_id
,并删除任何 <= 2 的值。然后将这些结果加入主票 table 以获取详细信息(名称,地址等...)。
查询:
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。你会很高兴你做到了。