Я, конечно же, могу сделать это путем повторения результатов с помощью 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. В основном для моего собственного любопытства и обучения.
Спасибо за распространение знаний!
EDIT:
Мне пришлось отредактировать запрос, потому что я оставил там одну пробную ошибку. Я также попытался использовать временный столбец, созданный из 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)
Саймон