我有一个包含用户事件数据的表。有些条目是收益事件,有些条目是负荷事件。加载事件的URL包含URL参数,收入和加载事件的URL都附加有session_id和user_id数据。我编写了一个查询,该查询将根据过去45天负载事件的URL参数从此表中提取用户和会话ID,然后我希望查找具有匹配的用户和会话ID的收入事件并将它们的总和。这是我的第一个查询:
SELECT user_id, session_id
FROM events
WHERE event_type = 'load'
AND client_id = 1234
AND calling_url LIKE '%utm_source=so%'
AND server_stamp BETWEEN DATE_SUB(NOW(), INTERVAL ? DAY) AND NOW()
从单个用户那里获得收入的查询将是这样的:
SELECT SUM(revenue_subtotal)
FROM events
WHERE event_type = 'revenue'
AND client_id = 1234
AND user_id = 'thisUUID'
AND session_id = 'thisSID'
因此,我试图找到一种方法来链接这两个查询,以总结直接从SQL中的第一个查询返回的所有用户/会话ID组合的收入(全部在一个完整查询中)。
不幸的是,此表有很多列,因此很难在SO上描述完整的表定义和完整的示例数据,但我认为我已经很好地阐明了这一点。不过,请让我知道是否需要更多信息或有关如何完成此操作的任何想法。截至目前,我唯一的方法是获取PHP中第一个查询的结果,然后针对返回的每一行循环执行一个新查询,但这很容易达到成千上万个,因此我尝试保留所有内容尽可能使用SQL。
答案 0 :(得分:4)
没有样本数据很难确定100%,但是您应该能够对client_id
,user_id
和session_id
进行自联接以获取所需的数据:
SELECT e1.user_id, e1.session_id, COALESCE(SUM(e2.revenue_subtotal), 0) AS revenue
FROM events e1
LEFT JOIN events e2 ON e2.client_id = e1.client_id
AND e2.session_id = e1.session_id
AND e2.user_id = e1.user_id
AND e2.event_type = 'revenue'
WHERE e1.event_type = 'load'
AND e1.client_id = 1234
AND e1.calling_url LIKE '%utm_source=so%'
AND e1.server_stamp BETWEEN DATE_SUB(NOW(), INTERVAL ? DAY) AND NOW()
GROUP BY e1.user_id, e1.session_id
请注意,我们使用LEFT JOIN
,因此在没有revenue
事件的情况下仍然可以得到结果,在这些情况下,COALESCE
可以使输出为0。
请注意,此查询上需要一个GROUP BY
子句以分隔每个事件的结果。