lorik Posté 24 Mars 2009 Posté 24 Mars 2009 Bonjour, Je suis confronté à un problème très complèxe (pour moi). Je vais essayer d'expliquer : J'ai une table basique, pour enregistrer des stats de visites en liens sponsorisés : id date nbvisites motclé enchere J'ai un enregistrement par jour et par motcle. visites varie chaque jour, et enchère 6-10 fois par mois. Ce que je cherche à faire, c'est une requéte qui me somme les visites entre 2 valeurs de date. ça, c'est simple. Là ou ça se complique, c'est que je voudrais que pour chaque motclé, ça me somme entre la date d'aujourdhui (ok), et la date de dernière modification de la valeur d'enchère. Sachant que cette date de modification, bien entendu, est differente pour chaque motclé. Ce que je ne veux pas, c'est passer par du script php pour trouver la date de dernière modif d'enchère pour un mot clé, et créer la requete pour ce mot clé, puis passer au suivant, enregistrement par enregistrement, parce que je vais exploser les temps de traitement. J'ai commencé à gratter du coté des sous-requetes, mais en pratique, je sèche complètement . Je n'ai aucune idée à creuser, je desespère. Si quelqu'un a une idée, il aura droit à ma reconnaissance eternelle Par avance merci.
SStephane Posté 25 Mars 2009 Posté 25 Mars 2009 Selon ta version de Mysql, tu peux faire des requêtes imbriquées : SELECT DATEDIFF((SELECT `date` FROM table where ID='1'),(SELECT `date` FROM table where ID='2')) as resultat from contenu group by resultat C'est pour te donner une idée, modifie les 2 requêtes imbriquées en sélectionnant selon tes critères, date, mot clé ou autre et ça fonctionnera . C'est comme ça que j'aurai fait, peut être y-a t-il une manière plus rapide, attends peut être la réponse d'un véritable spécialiste de SGBD.
jcaron Posté 25 Mars 2009 Posté 25 Mars 2009 (modifié) Je te propose: SELECT motcle, enchere, sum(visites) FROM table t1 WHERE enchere = ( SELECT enchere FROM table t2 WHERE t2.motcle=t1.motcle ORDER by date desc LIMIT 1 ) AND NOT EXIST ( SELECT * FROM table t3 WHERE t3.motcle=t1.motcle and t3.date>t1.date AND t3.enchere<>t1.enchere)GROUP BY motcle,enchere Mais ça risque d'être un peu dur avec ta base SQL si la table grossit un peu... Jacques. Modifié 25 Mars 2009 par Dadou Merci d'utiliser la balise CODE, le cas écheant SQL et de faire un minimun d'effort pour faciliter la lecture du code
lorik Posté 25 Mars 2009 Auteur Posté 25 Mars 2009 BOnjour SStephane, merci de ton aide, J'avais essayé les requetes imbriquées : Select enchere from table where enchere<>( Select enchere from table where day=14313) le problème, c'est que ça me remonte tous les enregistrements qui ont une enchère inférieure à l'enchère 'de référence' : En pratique, ça revient à faire un Select enchere from table where enchere<>XXX Il faut que j'arrive à faire un lien entre la requète 'mère' et l'enfant, pour avoir une ligne de résultat par motcle. Et ça, j'y arrive pas. J'ai essayé : Select enchere, motclé as kw from table where enchere<>( Select enchere from table where day=14313 and motcle=kw) Mais là, j'ai une erreur sql Unknown column 'kw' in 'where clause' Ya pas un pro du pot sur ce forum ? Bjr Jacques, nos posts se sont croisés, mais je pense que tu est dans le vrai (chouette, hein ? ), et tu m'a fourni la soluce pour l'erreur sql. Je teste ça tout de suite
Dadou Posté 25 Mars 2009 Posté 25 Mars 2009 J'ai modifié les différents post, pour des requetes SQL pensez à utiliser SQL au lieu de CODE
SStephane Posté 25 Mars 2009 Posté 25 Mars 2009 (modifié) Normal tu dois faire Select enchere, motclé as kwfrom table where enchere IN ( Select enchere from table where day=14313 and motcle=kw) and motcle IN (Select motcle from table where day=14313) Modifié 25 Mars 2009 par SStephane
lorik Posté 25 Mars 2009 Auteur Posté 25 Mars 2009 Bon, la requete de Jacques fonctionne...presque en fait elle me remonte la somme des visiteurs pour la plage d'enregistrements qui ont une enchère differente de l'enchère initiale. C'est déja super. Mais ce que je cherche, c'est d'avoir la somme des visiteurs pour l'enchère initiale. Plus clair : - je donne une date de début - la requete me remonte, groupée par motcle, la somme des visites entre la date de début et la première date à laquelle l'enchère a ete modifiée (en remontant dans le temps). Exemple : date motcle visites enchere 14048 19 11 0,02 14298 629 29 0,07 14301 629 1 0,06 14301 19 41 0,07 14304 19 10 0,07 14304 629 1 0,07 14306 19 21 0,07 14307 19 34 0,07 14308 602 1 0,03 14308 19 20 0,07 14310 19 13 0,07 14311 602 1 0,07 14311 629 1 0,07 14311 1009 1 0,01 14311 19 10 0,07 14312 19 26 0,07 14313 19 27 0,07 14319 19 31 0,6 14320 19 25 0,6 14321 19 23 0,6 14327 19 33 0,6 si je donne 14320 comme date de début, la requete devrait me remonter motcle sum(visites) 19 56 ->31+25 1009 1 629 2 ->1+1 602 1 J'ai essayé de bidouiller la requete de Jacques, mais sans succès, le 'not exist' est assez nébuleux pour moi, je vois pas à quoi ça sert ici (mais ça sert, manifestement )
jcaron Posté 25 Mars 2009 Posté 25 Mars 2009 Ma requête te donne la somme (jusqu'à aujourd'hui) pour la dernière enchère pour chaque mot-clef, qui est ce que tu avais initialement demandé il me semble. Et maintenant tu dis que tu veux ceux pour l'enchère "initiale", puis avec une histoire de date de début. Ca devient touffu :-) select motcle,enchere,sum(visites) from t t1 where enchere = (select enchere from t t2 where t2.motcle=t1.motcle and date <= 14320 order by date desc LIMIT 1 ) and not exists (select * from t t3 where t3.motcle=t1.motcle and t3.date>t1.date and t3.enchere<>t1.enchere and t3.date<= 14320) and date <= 14320 group by motcle,enchere Le "not exists" permet ici de ne pas prendre en compte les lignes de t1 pour lesquels il existe une enchere différente à une date postérieure (à la ligne de t1). Ca permet de tenir compte des variations genre 0.1 0.1 0.1 0.2 0.2 0.1 0.1 0.1 (tu veux ignorer les trois premiers 0.1: il existe pour chacune une ligne avec une date supérieure et une enchère différente, donc elles sont éliminées). Jacques.
lorik Posté 25 Mars 2009 Auteur Posté 25 Mars 2009 Bonsoir Jacques oublie l'histoire de la date de début, je n'en avais pas parlé au début parce que ça me semblait déja assez complexe comme ça Ma requête te donne la somme (jusqu'à aujourd'hui) pour la dernière enchère pour chaque mot-clef Par contre, ta requete (dont je te remercie mille fois) ne donne pas le resultat que tu annonces (et qui est bien ce que je cherche) : elle donne la somme des visites pour l'AVANT dernière enchère, pas la dernière: Si on a (pour un mot clé) les enchères suivantes (une par jour) : 6 6 3 3 3 2 2 2 2 Ta requete renvoie 9 (3 + 3 +3) et pas 8 (2+2+2+2).
jcaron Posté 25 Mars 2009 Posté 25 Mars 2009 Si tu mets la bonne date (ou si tu utilises la première version que j'ai donnée), tu obtiendras le bon résultat. D'ailleurs avec les données que tu as données dans ton message de 13h30 et la requête que j'ai donné ensuite, on obtient effectivement les résultats que tu veux (et as indiqués dans le même message). Et dans ton dernier message tu ne donnes qu'une seule série (nombre de visites ou enchères?), donc je ne sais pas très bien comment on pourrait arriver à quoi que ce soit avec ça... Jacques.
lorik Posté 26 Mars 2009 Auteur Posté 26 Mars 2009 Bonsoir Jacques Toutes mes excuses, je ne sais pas comment j'ai fait mon compte, mais tu as raison, ta requete renvoie bien les bons résultats. Pour les données présentées, c'etait juste pour illustrer les enchères, ce n'etaient bien sur pas des données complètes, qui, à mon sens, n'auraient rien apporté à ce stade. Bon en tout cas 1000 mercis de ton aide (valable aussi pour les autres), ça va me permettre de bien avancer. Je vais passer un peu de temps quand même pour essayer de la comprendre, ta requete, parce que l'objectif, c'est pas de copier, mais d'apprendre, et là, ça reste assez obscur... Mais bon, j'ai toutes les nuits jusqu'à cet été pour ça Un dernier point, si j'ose abuser : Comment intégrer à la requete une notion de date de départ (j'y reviens) : C'est à dire, que la requete remonte la somme des enchères depuis la dernière modification ANTERIEURE à une date données ? ++
Portekoi Posté 26 Mars 2009 Posté 26 Mars 2009 Bonsoir, Lorik : Je pense qu'il serait bon que tu cherches un peu plus par toi même car jacques a fait 99.9% du boulot... Y a qu'en faisant des erreurs que l'on apprend Portekoi
jcaron Posté 26 Mars 2009 Posté 26 Mars 2009 La deuxième requête que j'ai donnée fait justement ça, partir d'une date arbitraire plutôt que d'aujourd'hui (remplacer 14320 par la date voulue...). La requête est un peu complexe, mais c'est pas si difficile que ça à expliquer: ce que tu veux, c'est faire la somme des visites pour les lignes qui ont une enchère qui correspond à la dernière enchère (à la date voulue), mais pour lesquelles il n'y a pas de lignes postérieures avec une enchère différente. Trivial, quoi :-) Ceci dit avant mon premier message j'ai failli dire que ce n'était pas possible en SQL ;-> Jacques.
lorik Posté 26 Mars 2009 Auteur Posté 26 Mars 2009 Bjr Portequoi Bah tu vois, ça fait 3 jours que je suis sur une requete, j'ai pas l'impression de pas avoir cherché... Je suis pas developpeur, je n'ai pas de formation en dev, je fais du marketing. C'est un hobby, j'ai mes limites, et là, oui, c'est au dela ce mes compétences. C'est pas une question de pas connaitre la fonction qui va bien est qu'on peut trouver dans une doc ou sur Google. Là, même avec la solution sous les yeux, je comprends pas plus. Donc oui, je vais chercher (c'est même ce que j'ai écrit, non ?), mais tu vois, quand je me fait ch... depuis 3 jours sur un truc sans même voir le début de la solution, un coup de main, ça fait plaisir. J'ai pas demandé qu'on me donne la solution 'toute cuite' (merci quand même Jacques), mais qu'on me donne un fil à tirer, après 3 jours de galère. Si un forum n'est pas fait pour ça, désolé, j'avais pas compris... Et merci pour tout Jacques, j'y vois un poil plus clair
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant