2010-09-13 21 views
0

Je peux certainement le faire en itérant à travers les résultats avec PHP, mais je voulais juste savoir si quelqu'un avait une seconde pour poster une meilleure solution.MySQL SELECT MIN pour tous les temps, mais seulement retourner si BETWEEN dates

Le scénario est que j'ai une liste de transactions. Je sélectionne deux dates et lance un rapport pour obtenir les transactions entre ces deux dates ... facile. Cependant, pour l'une des sections de rapports, je dois seulement retourner la transaction s'il s'agissait de leur première transaction.

Voici où je suis arrivé était avec la requête:

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 

Cela me donne l'MIN des transactions entre les dates sélectionnées. Ce dont j'ai vraiment besoin, c'est le MIN global s'il se situe entre les deux dates. Cela a-t-il du sens?

J'ai fondamentalement besoin de savoir si un client a acheté pour la première fois au cours de la période considérée.

De toute façon, pas de précipitation comme je peux le résoudre avec PHP. Surtout pour ma propre curiosité et d'apprentissage.

Merci pour la diffusion des connaissances!

EDIT: J'ai dû modifier la requête car j'avais laissé une de mes erreurs d'essai là-dedans. J'avais également essayé d'utiliser la colonne temporaire créée à partir de MIN comme le sélecteur entre les deux dates. Cela a renvoyé une erreur.

SOLUTION: Voici la requête révisée après l'aide de vous les gars:

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' 

Répondre

2

Si nous faisons un minimum de toutes les transactions par client, puis vérifiez si cela est dans la bonne période que nous obtenons quelque chose le long des lignes de ...

Cela vous donnera simplement un oui/non drapeau quant à savoir si le premier achat du client était dans la période ...

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 

(ce qui est en T-SQL, mais devrait nous l'espérons donner une idée de la façon dont cela peut être réalisé de façon similaire dans mySQL)

Simon

+0

Oh wow, ce qui est excellent choses. Toutes ces années ... sous-requêtes .... qui savait;) Merci. –