在连接具有条件的某些表时,来自其他表的SUM数据

时间:2012-04-16 14:43:04

标签: php mysql join sum left-join

我遇到了一个复杂的问题。

我有一个组合来自多个表的数据的查询。例如:

traffic: id, traffic_source_id, first_hit_date
goals: id, goal_type, goal_date, goal_value
traffic_sources: id, source_name

goal_type可以是“联系表单”,“演示下载”,“购买” goal_value是数字。并显示用户在同一天(日)到达目标的次数。

我正在尝试为每个traffic_id显示一行,然后对此traffic_id的每个目标求和。当用户第一次来时,他/她获得与他一起的流量ID(cookie)。例如,他/她可以在第一个命中日期后一周后达到目标,然后在2天后达到其他目标。

我希望能够从日期>查询到目前为止,并显示该特定范围的目标的正确总和值。 当我尝试使用SUM(CASE WHEN ...)时,我不能仅仅根据目标表来计算范围。

例如: 的流量 从:1-feb到28-feb

3 | google adwords | 0 contact | 1 demo download | 1 purchase
4 | facebook       | 1 contact | 3 demo download | 3 purchase

但是当我想将范围从1-feb改为14-feb

3 | google adwords | 0 contact | 1 demo download | 0 purchase
4 | facebook       | 0 contact | 2 demo download | 2 purchase
希望我足够清楚......

任何建议都将不胜感激。


更新: 查询我现在拥有的例子:

SELECT traffic.traffic_id as original_traffic_id hit_date, referrer, referrer_url, keyword, ip,
SUM(CASE goals.goal_type WHEN 'Contact' THEN 1 ELSE 0 END) goal_contact,
SUM(CASE goals.goal_type WHEN 'Download' THEN 1 ELSE 0 END) goal_download,
SUM(CASE goals.goal_type WHEN 'Signup' THEN 1 ELSE 0 END) goal_signup,
SUM(CASE goals.goal_type WHEN 'Purchase' THEN 1 ELSE 0 END) goal_purchase
FROM traffic
LEFT JOIN goals ON goals.traffic_id = traffic.traffic_id
WHERE traffic.traffic_id=100 AND hit_date >= '$from_date' AND hit_date <= '$to_date'

(其中$ from_date和$ to_date是mysql日期格式)

(这不是真正的查询,因为原始查询要大得多,并且包含大约7个连接的表) 此查询实际上总结了所有目标,而没有进入cound goal_date。我希望能够将SUM限制在$ from_date和$ to_date

的范围内

希望它能更清楚一点。

1 个答案:

答案 0 :(得分:0)

我还没有这方面的答案,但我所做的就是在第一个目标之前用另一个查询来总结所有目标。 该数组看起来像$goals_array[traffic_id][goal_type] -> value

在循环主sql时,只需从$ goals_array中获取值。 它工作得很快,而且我希望在一个查询中做到这一点,现在没问题。