遍历子查询结果以查询同一张表

时间:2019-10-12 06:55:21

标签: mysql sql join

我有一个包含用户事件数据的表。有些条目是收益事件,有些条目是负荷事件。加载事件的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。

1 个答案:

答案 0 :(得分:4)

没有样本数据很难确定100%,但是您应该能够对client_iduser_idsession_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子句以分隔每个事件的结果。