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 解决这个问题。主要是为了我自己的好奇心和学习。

感谢传播知识!

编辑:我不得不编辑查询,因为我在那里留下了一个试验错误。我还尝试使用创建的临时列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'
4

1 回答 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 中类似地实现这一点)

西蒙

于 2010-09-13T13:43:03.220 回答