MySQL выберите мин на все время, но только вернуть, если между датами
Вопрос
Я, безусловно, могу сделать это, итерацию по результатам с 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)
Симон