Перебрать результаты подзапроса для запроса к той же таблице - PullRequest
1 голос
/ 12 октября 2019

У меня есть таблица, которая содержит данные о пользовательских событиях. Некоторые записи являются событиями дохода, а некоторые - событиями загрузки. У событий загрузки есть URL-адреса, содержащие параметры URL, а к событиям выручки и загрузки прикреплены данные session_id и user_id. Я написал запрос, который будет извлекать идентификаторы пользователя и сеанса из этой таблицы на основе параметров URL-адреса для событий загрузки за последние 45 дней, и я хотел бы затем искать события дохода с соответствующими идентификаторами пользователя и сеанса и общей суммой для них. ,Вот мой первый запрос:

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 (все в одном полном запросе).

К сожалению, в этой таблице много столбцов, поэтому дается полное определение таблицы иполные выборочные данные немного трудно изобразить на SO, но я думаю, что достаточно хорошо их изложил. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация или идеи о том, как этого добиться. На данный момент единственный способ, который у меня есть, - это получить результаты первого запроса в PHP, а затем выполнить цикл выполнения нового запроса для каждой возвращаемой строки, но это может легко попасть в тысячи, поэтому я пытаюсь сохранить всев SQL, если это вообще возможно.

1 Ответ

4 голосов
/ 12 октября 2019

Без примеров данных трудно быть на 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 предложение в этом запросе для разделения результатов для каждого события.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...