2011-11-17 6 views
-1

s'il vous plaît un coup d'oeil de cette requête:Structuration Très complexe d'une requête MySQL

SELECT DATE(datetime), COUNT(1) as numVisits 
FROM ".table_stats." 
WHERE type='profile_visit' 
    AND user_url = '".$_GET['ref']."' 
    AND id_user='".$_SESSION['user_code']."' 
GROUP BY DATE(DATE_SUB(datetime, INTERVAL 1 DAY)) 

Cette requête compte le nombre de fois que de type est égal à chaque date « profile_visit », comme un résultat cela me donne deux lignes (DATE (datetime), numVisits). Ceci est une capture d'écran de la table table_stats: Table 1 Table_Stats


Ok, jusqu'à présent, vous pouvez comprendre que chaque fois qu'un utilisateur arrive sur le site un nouvel élément est inséré sur la table avec de type = profile_visit et le champ datetime avec la date et l'heure de la visite, c'est pourquoi j'utilise un GROUP BY DATE (datetime) pour compter le nombre total de visites par jour.

vient ici la partie complexe, lorsque le champ de type est égal à « clic » et l'origine est « diablotin » qui signifie qu'un utilisateur touche un bouton particulier sur la page, je vais savoir comment plusieurs fois ce bouton a été cliqué (peu importe l'adresse IP) par jour, tout comme je l'ai fait avec les visites de profil.

Je peux faire deux querys, un à connaître les visites totales (comme le précédent) et un autre similaire juste en regroupant par datetime lorsque est le type « clic » et origine est « diablotin ». Le problème est que je voudrais faire cela en un seul appel afin de compter le nombre total de visites par date dans la ligne NumVisits comme je l'ai fait avant et une nouvelle ligne appel NumClick avec le nombre total de clics effectués. C'est pourquoi je ne veux pas plus de calculs sur mon serveur php, si c'est possible de faire tout le calcul sur le serveur sql.

Donc finalement, si vous appelez cette requête à la table:

SELECT DATE(DATETIME) , COUNT(1) AS numVisits 
FROM stats_ram 
WHERE TYPE = 'profile_visit' 
AND user_url = 'xxx' 
AND id_user = '88e91' 
GROUP BY DATE(DATE_SUB(DATETIME, INTERVAL 1 
DAY)) 
LIMIT 0 , 30 

Vous obtiendrez:

DATE(datetime) numVisits 
2011-11-16  7 

Comment puis-je ajouter une autre ligne avec le type total = clic et origine = imp fait par DATE (datetime) ???

Merci pour toute aide !!!

+1

Tout d'abord, s'il vous plaît ne pas utiliser $ _GET directement dans votre SQL ... –

+0

ne vous inquiétez pas sur les questions de sécurité c'est juste un exemple – DomingoSL

+0

@DomingoSL: 'interpoler _GET' $ directement dans la déclaration suggère qu'il Il y a d'autres problèmes avec le code, comme le fait d'interpoler des valeurs plutôt que d'utiliser une instruction préparée. – outis

Répondre

3
SELECT 
    DATE(DATETIME), 
    SUM(CASE WHEN type = 'profile_visit' THEN 1 ELSE 0 END) AS numVisits, 
    SUM(CASE WHEN type = 'click' AND origin = 'imp' THEN 1 ELSE 0 END) numClicks 
FROM stats_ram 
WHERE user_url = 'xxx' 
    AND id_user = '88e91' 
GROUP BY DATE(DATE_SUB(DATETIME, INTERVAL 1 DAY)) 
LIMIT 0, 30 
+0

Parfait! Merci!!!! – DomingoSL