我当然可以通过使用 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 中实现类似的效果)
西蒙
关于php - MySQL SELECT MIN 对于所有时间,但仅在 BETWEEN 日期时返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3700806/