MySQL выберите мин на все время, но только вернуть, если между датами

StackOverflow https://stackoverflow.com/questions/3700806

  •  02-10-2019
  •  | 
  •  

Вопрос

Я, безусловно, могу сделать это, итерацию по результатам с PHP, но просто хотел знать, было ли у кого-то второе, чтобы опубликовать лучшее решение.

Сценарий состоит в том, что у меня есть список транзакций. Я выбираю два дата и запустите отчет, чтобы получить транзакции между этими двумя датами ... легко. Для одного из разделов отчетности, хотя мне нужно только вернуть транзакцию, если это была их первая транзакция.

Вот где я получил с запросом:

 SELECT *, MIN(bb_transactions.trans_tran_date) AS temp_first_time 
 FROM 
   bb_business      
   RIGHT JOIN bb_transactions ON bb_transactions.trans_store_id = bb_business.store_id 
   LEFT JOIN bb_member ON bb_member.member_id = bb_transactions.trans_member_id 
 WHERE 
   bb_transactions.trans_tran_date BETWEEN '2010-08-01' AND '2010-09-13' 
   AND bb_business.id = '5651' 
 GROUP BY bb_member.member_id 
 ORDER BY bb_member.member_id DESC

Это дает мне MIN транзакций между выбранными датами. Что мне действительно нужно, это в целом MIN Если он падает между двумя датами. Имеет ли это смысл?

Я в основном нужно знать, если клиенты впервые приобретены в отчетном периоде.

В любом случае, нет огромного спешки, как я могу решить с PHP. В основном для моего собственного любопытства и обучения.

Спасибо за распространение знаний!

Редактировать: мне пришлось редактировать запрос, потому что я оставил один из моих пробных ошибок там. Я также пытался использовать временный столбец, созданный из MIN как селектор между двумя датами. Это вернуло ошибку.

Решение: вот пересмотренный запрос после справки от вас, ребята:

SELECT * FROM (
  SELECT 
    bb_member.member_id, 
    MIN(bb_transactions.trans_tran_date) AS first_time
  FROM 
    bb_business 
    RIGHT JOIN bb_transactions ON bb_transactions.trans_store_id = bb_business.store_id 
    LEFT JOIN bb_member ON bb_member.member_id = bb_transactions.trans_member_id 
  WHERE bb_business.id = '5651' 
  GROUP BY bb_member.member_id
) AS T 
WHERE T.first_time BETWEEN '2010-08-01' AND '2010-09-13'
Это было полезно?

Решение

Если мы сделаем минимум всех транзакций заказчиком, то проверьте, если это в правильном периоде, мы получаем что-то по линии ...

Это просто даст вам флаг Да / Нет относительно того, был ли первая покупка клиента в течение периода ...

SELECT CASE COUNT(*) WHEN 0 THEN 'Yes' ELSE 'No' END As [WasFirstTransInThisPeriod?]
FROM (  
        SELECT bb_member.member_id As [member_id], MIN(bb_transactions.trans_tran_date) AS temp_first_time 
        FROM bb_business      
        RIGHT JOIN bb_transactions ON bb_transactions.trans_store_id = bb_business.store_id 
        LEFT JOIN bb_member ON bb_member.member_id = bb_transactions.trans_member_id 
        WHERE bb_business.id = '5651' 
        GROUP BY bb_member.member_id
    ) T
WHERE T.temp_first_time BETWEEN '2010-08-01' AND '2010-09-13'
ORDER BY T.member_id DESC

(Это в T-SQL, но, надеюсь, даст идею о том, как это может быть достигнуто аналогично в MySQL)

Симон

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top