我有一个包含用户事件数据的表。有些分录是收入事件,有些分录是加载事件。加载事件具有包含URL参数的URL,收入和加载事件都附加了session_id和user_id数据。我编写了一个查询,它将根据过去45天的加载事件的URL参数从该表中提取用户和会话I,然后我希望查找具有匹配的用户和会话I的收入事件,并合计它们的金额。下面是我的第一个问题:
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组合中获得的收入(所有这些都在一个完整的查询中)。
不幸的是,这个表有很多列,所以给出完整的表定义和完整的样本数据有点困难,但是我认为我已经很好地说明了这一点。请让我知道,但如果需要更多的信息或任何想法,如何实现这一点。到目前为止,我唯一的方法是在PHP中获得第一个查询的结果,然后对返回的每一行执行一次do new查询,但这很容易达到数千,所以如果可能的话,我尽量使用SQL。
发布于 2019-10-12 07:04:33
没有样本数据,很难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
子句来分隔每个事件的结果。
https://stackoverflow.com/questions/58351662
复制相似问题