Aller au contenu

Problème sql très complexe


lorik

Sujets conseillés

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 :D

Par avance merci.

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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é 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
Lien vers le commentaire
Partager sur d’autres sites

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 ? :D

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 :)

Lien vers le commentaire
Partager sur d’autres sites

Normal tu dois faire

Select enchere, motclé as kw
from 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é par SStephane
Lien vers le commentaire
Partager sur d’autres sites

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 :) )

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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).

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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 ?

++

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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 :)

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...