MySQL SELECT MIN на все время, но возвращается только если между датами

0

Я, конечно же, могу сделать это путем повторения результатов с помощью 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'
Теги:
between

1 ответ

2
Лучший ответ

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

Это просто даст вам флаг "да/нет" в отношении того, была ли покупка клиента первой в течение периода...

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)

Саймон

  • 0
    О, это здорово. Все эти годы ... подзапросы .... кто знал;) Спасибо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню