我正在查询表以获取所有可用记录。结果有一个名为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>
答案 0 :(得分:3)
更新:
由于表结构和期望的结果存在一些混淆,因此我根据您的描述将SQL Fiddle组合在一起。这是共享模式和示例数据的好工具,并且有助于避免查询问题引起很多麻烦:-)我不知道您使用的是哪个版本的MySQL,因此我假设使用的是旧版本最佳兼容性。
如果我理解正确,那么我们的目标是显示所有service_ticket
记录,并具有 overall service_qty
>2。为此,请使用子查询来求和将service_qty
值乘以ticket_id
,并删除所有<=2。然后将这些结果重新返回到主票证表以获取详细信息(名称,地址等)。 / p>
查询:
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。您会很高兴的。