0

PHPで結果を繰り返すことでこれを確実に行うことができますが、誰かがより良い解決策を投稿する秒があるかどうかを知りたかっただけです。

シナリオは、トランザクションのリストがあるというものです。2つの日付を選択し、レポートを実行して、これら2つの日付間のトランザクションを取得します...簡単です。ただし、レポートセクションの1つについては、最初のトランザクションである場合にのみトランザクションを返す必要があります。

これが私がクエリで得たところです:

 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、2つの日付の間にある場合の全体です。それは理にかなっていますか?

基本的に、顧客がレポート期間中に初めて購入したかどうかを知る必要があります。

とにかく、私がPHPで解決できるので、大急ぎではありません。主に私自身の好奇心と学習のためです。

知識を広めてくれてありがとう!

編集:試行錯誤の1つをそこに残していたため、クエリを編集する必要がありました。MINまた、2つの日付の間のセレクターとしてから作成された一時列を使用しようとしました。エラーが返されました。

解決策:皆さんの助けを借りて修正されたクエリは次のとおりです。

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 に答える