SQL : Un champ sur X

18 réponses
AuteurMessage

superfc |
Membre

Photo de superfc

Inscrit le : 01/07/2006

# Le 03/01/2007 à 01:54

Bonjour,

Je pose la question sur ce forum parce que je ne sais pas comment la formuler proprement.

Comment peut-on récupérer une ligne sur X ? Genre une ligne sur 3. Pour ceux pour qui ma demande ne serait pas tout à fait claire, voila le code équivalent :
while( ... ) {
$ligne = $BDD->fetch_assoc( $req );
if ( ! $i++%3 )
traite( $ligne );
}

Merci...

Florent Clairambault - http://florent.clairambault.frOuvrir dans une nouvelle fenetre
Gtalk : superfc@gmail.com

major Den | Denis
Membre

Photo de major Den

Inscrit le : 09/05/2005

# Le 03/01/2007 à 03:25

Avec un id auto-incrémenté et sans trous, tu peux certainement le faire avec un modulo du style "WHERE MOD(id, 3) = 0"

Rien ne sert de courir, on ira une autre fois.

Bool | Olivier
Modérateur

Photo de Bool

Inscrit le : 09/05/2005

# Le 03/01/2007 à 09:33

Hello,

pas sûr du code à 100%, mais sans ID incrémenté ça pourrait donner un truc de ce genre :

@count = 0;
select *
from (
select champ1, champ2, @count:=@count+1 as rownum
from table1, table2
[...]
)
where mod( rownum, 3 ) = 0

daevel : infogérance et conseilOuvrir dans une nouvelle fenetre || moiOuvrir dans une nouvelle fenetre

superfc | Florent
Membre

Photo de superfc

Inscrit le : 01/07/2006

# Le 03/01/2007 à 12:33

Major Den, le problème c'est que je veux pouvoir appliquer des critères à cette requête, donc fonctionner sur les ID c'est faux.

Merci pour ta technique Bool, je vais l'essayer.

Florent Clairambault - http://florent.clairambault.frOuvrir dans une nouvelle fenetre
Gtalk : superfc@gmail.com

major Den | Denis
Membre

Photo de major Den

Inscrit le : 09/05/2005

# Le 03/01/2007 à 13:03

Rien ne sert de courir, on ira une autre fois.

devtribu | Olivier
Modérateur

Photo de devtribu

Inscrit le : 16/06/2005

# Le 03/01/2007 à 16:00

dans ce cas, je fais :
ORDER BY RAND()
et j'arrete le fetch une fois les nb_lignes / X atteint

Février 2019, mon futur livre Tout JavaScript chez Dunod https://amzn.to/2PoLd0fOuvrir dans une nouvelle fenetre

MathieuC | Mathieu
Modérateur

Photo de MathieuC

Inscrit le : 15/07/2005

# Le 03/01/2007 à 16:08

tu peux meme mettre direct un limit en SQL.

Par contre, ca ne donne pas une ligne sur X, ca t'en donne certaines aleatoirement, c'est pas exactement pareil, ca depend donc du besoin.

devtribu | Olivier
Modérateur

Photo de devtribu

Inscrit le : 16/06/2005

# Le 03/01/2007 à 16:11

oui, le limit en sql est possible
mais faut faire une requete sql avant pour compter combien il faut en sortir

Février 2019, mon futur livre Tout JavaScript chez Dunod https://amzn.to/2PoLd0fOuvrir dans une nouvelle fenetre

major Den | Denis
Membre

Photo de major Den

Inscrit le : 09/05/2005

# Le 03/01/2007 à 16:22

devtribu a dit :
oui, le limit en sql est possible
mais faut faire une requete sql avant pour compter combien il faut en sortir



Si tu veux Z enregistrements aléatoires, tu fais un "ORDER BY RAND() LIMIT Z" et tu en auras Z au maximum. Evidemment, faut connaître le Z à l'avance, mais c'est pas une requête qui pourra te dire combien d'enregistrements tu veux.

Mais j'avoue que je ne comprends pas bien le "et j'arrete le fetch une fois les nb_lignes / X atteint"...

Si sa table ne change pas, superfc obtiendra toujours les mêmes résultats pour la même requête. Il y aura donc 2/3 des données qui ne seront jamais exploités pour cette même requête (à moins de changer le test du modulo en 1 ou 2), mais c'est certainement voulu.

Rien ne sert de courir, on ira une autre fois.

devtribu | Olivier
Modérateur

Photo de devtribu

Inscrit le : 16/06/2005

# Le 03/01/2007 à 16:37

major den a dit "je veux pouvoir appliquer des critères à cette requête"
ca suppose qu'il ne connait pas a l'avance combien de lignes il retourne (que tu nomme Z)
ce n'est pas toujours le nb total de ligne de la table

d'ou l'idée de soit faire un compteur dans le fetch qui s'arrete a mysql_num_rows / X, soit une requete avant sur les criteres

A un besoin, il existe toujours plusieurs solutions
aucune n'est meilleure
mais ca me paraissait interessant de rappeler l'existence du rand()




Février 2019, mon futur livre Tout JavaScript chez Dunod https://amzn.to/2PoLd0fOuvrir dans une nouvelle fenetre

major Den | Denis
Membre

Photo de major Den

Inscrit le : 09/05/2005

# Le 03/01/2007 à 17:09

devtribu a dit :
major den a dit "je veux pouvoir appliquer des critères à cette requête"

Non, c'est superfc qui a dit ça

Ce que moi je disais, c'est que quelle que soit la méthode utilisée, ce sont les critères qui vont déterminer le nombre de lignes retournées. Peu importe que ce nombre soit divisé par 3 ou autre, il restera toujours indéterminé à l'avance.

Par contre, le nombre de lignes que l'on veut récupérer, il est forcément connu à l'avance. Et c'est ça mon Z, le nombre de lignes (maximum) que l'on veut récupérer, pas le nombre de toutes celles qui satisfont les critères de la requête ni le nombre total de lignes de la table.

En ce qui concerne le RAND(), je suis tout à fait d'accord avec toi. Pour prendre des enregistrements au hasard, c'est la solution la plus pratique.

Rien ne sert de courir, on ira une autre fois.

devtribu | Olivier
Modérateur

Photo de devtribu

Inscrit le : 16/06/2005

# Le 03/01/2007 à 17:20

oui, je voulais citer superfc evidemment

pour moi, Z n'est pas connu a l'avance
en utilisant RAND(), on obtient toutes les lignes
si on veut n'en prendre que 1 ligne sur X, il faut forcement limiter le retour

imaginons le critere
WHERE nom LIKE "A%"

on trouve Z
select count(*) as Z
from table
WHERE nom LIKE "A%"

ensuite, on extrait une ligne sur 3

$limite=round(Z/3);
select *
from table
WHERE nom LIKE "A%"
ORDER BY rand()
limit $limite

Ca serait interessant d'avoir la solution finale de superfc en tout cas
Et j'aimerai bien aussi comprendre le cas concret d'utilisation

Février 2019, mon futur livre Tout JavaScript chez Dunod https://amzn.to/2PoLd0fOuvrir dans une nouvelle fenetre

major Den | Denis
Membre

Photo de major Den

Inscrit le : 09/05/2005

# Le 03/01/2007 à 17:36

Je suis d'accord avec tout ce que tu dis, sauf que j'associais mon Z avec un nombre connu à l'avance (dans le cas d'un affichage page par page, par exemple) et pas du tout au fait de ne récupérer qu'une ligne sur 3 sur la quantité retournée (car je trouve que ça n'a aucun intérêt, en fait)

Avec ton Z, je suis d'accord avec toi : une pré-requête pour connaître le nombre à diviser par 3 s'impose.

Ceci dit, j'aimerais bien aussi comprendre la finalité de ne récupérer qu'un enregistrement sur trois

Rien ne sert de courir, on ira une autre fois.

MathieuC | Mathieu
Modérateur

Photo de MathieuC

Inscrit le : 15/07/2005

# Le 03/01/2007 à 19:20

La discussion n'a aucun interet vu qu'on ne connait pas precisement le besoin

Il a demande une solution technique, vous lui apportez tous les deux selon votre point de vue. Moi non plus je ne vois pas dans quel cas concret ca peut servir, mais vu qu'il nous l'a pas dit...

C'est toujours le probleme des messages qui ne precisent pas le contexte, personne ne pourra apporter la bonnes solution sans connaitre la problematique

major Den | Denis
Membre

Photo de major Den

Inscrit le : 09/05/2005

# Le 03/01/2007 à 19:38

Telaxo a dit :La discussion n'a aucun interet vu qu'on ne connait pas precisement le besoin

Ouais, c'était un peu la conclusion de nos deux derniers posts

Telaxo a dit :Il a demande une solution technique, vous lui apportez tous les deux selon votre point de vue.

En fait, non, depuis le Z, je ne cherche plus à aider superfc
La réponse à sa question, c'est plutôt Bool qui lui a apportée.
Quant à la meilleure solution à son problème, c'est une autre histoire

Rien ne sert de courir, on ira une autre fois.

superfc | Florent
Membre

Photo de superfc

Inscrit le : 01/07/2006

# Le 04/01/2007 à 01:19

Ok le besoin, je vous le donne... C'est afficher un tracé GPS, exemple :
http://www.gpsfrance.net/logs/consultation,util,Fl...Ouvrir dans une nouvelle fenetre

Affichez le 1/1/2007 entre 19 et 20h, vous avez un jolie tracé instantané
Si maintenant, vous faites entre le 1/1/2007 et le 3/1/2007, votre navigateur va légèrement ramer...

Ce que je veux faire, c'est que le programme ne retourne pas TROP de points. En effet la base de données contient parfois un enregistrement par seconde, ça peut être très très lourd.

Donc, ce qu'il me faut c'est pouvoir limiter le nombre max de points (genre à 2000, ça représente déjà plusieurs méga de données balancées en Ajax). Et pour cela, la précision importe peu.

J'envisage d'autres méthodes, car comme ça sera sans doute mis en cache (si la date de fin ne dépasse pas la date actuel), le calcul n'est critique.

De toute façon la fonctionnalité la plus intéressante, c'est le suvi "temps réel" : http://www.gpsfrance.net/logs/realtime,util,Floren...Ouvrir dans une nouvelle fenetre

Je fais tout ça dans l'optique d'un truc "plus intéressant". Mais j'ai déja l'impression d'en dire 20x trop.

Note : A certains moment, il y a des "gribouillages", ce sont les moments où je suis en intérieur (la précision est pourrie). Ca sera corrigé...

Note 2 : Si il y a des gens qui ont des appareils sous Windows Mobile (Pocket PC, SmartPhone) avec GPS et qui ont envie de perdre du temps à tester, ça m'intéresse.

Florent Clairambault - http://florent.clairambault.frOuvrir dans une nouvelle fenetre
Gtalk : superfc@gmail.com

devtribu | Olivier
Modérateur

Photo de devtribu

Inscrit le : 16/06/2005

# Le 04/01/2007 à 11:00

Merci pour l'explication

Ce que je ferai c'est une requete sur tous les points mais je n'enverrai un nouveau point que si la distance avec le précédent est suffisante pour apporter un interet au tracé

Février 2019, mon futur livre Tout JavaScript chez Dunod https://amzn.to/2PoLd0fOuvrir dans une nouvelle fenetre

MathieuC | Mathieu
Modérateur

Photo de MathieuC

Inscrit le : 15/07/2005

# Le 04/01/2007 à 11:04

Oui, je pense aussi que c'est en PHP que tu vas devoir filtrer et choisir quels points sont envoyes au client.

Tes criteres sont a mon avis trop complexes pour etre simplement retranscrits en SQL comme ca

superfc | Florent
Membre

Photo de superfc

Inscrit le : 01/07/2006

# Le 04/01/2007 à 11:17

Oui, je pense que t'as raison. Je vais tester cette solution dans un premier temps parce qu'il faut que j'incorpore la gestion des "sauts" de toute façon, pour l'instant ça fait des grandes lignes.

Florent Clairambault - http://florent.clairambault.frOuvrir dans une nouvelle fenetre
Gtalk : superfc@gmail.com

Répondre

Vous ne pouvez pas participer au forum, car votre inscription n'a pas été validée. Pour vous faire valider en tant que Membre, cliquez ici.

© MHN - Tous droits réservés | CNIL N°844440 | 24/11/2024 12:27:27 | Généré en 11.3ms | Contacts | Mentions légales |