Page 1 sur 1

php/sql position d'une ligne dans une requête (classement)

Posté : 30 avr. 2012, 16:23
par Zahnzao
Bonjour,

j'essaye de trouver le moyen de retourner la position d'une ligne dans une requête triée.

Voici une requête simple :
$sql='SELECT id,name,day,week,month FROM blog ORDER BY day';
Pour trouver la position d'une ligne donnée, je pourrai boucler en incrémentant une variable $pos et lorsqu'il trouve l'id du blog je récupère mon $pos et j'ai la position.
$pos=0;
while($data=mysql_fetch_array($req)){
    $pos++;
    if($data['id'] == $id){
        $position=$pos;
    }
}
Mais ça me semble beaucoup pour pas grand chose...

N'y à t'il pas une solution plus optimisée autant pour php que pour mysql ?

Merci

Re: php/sql position d'une ligne dans une requête (classemen

Posté : 30 avr. 2012, 17:08
par dix2
salut,

ça devrait être quelque chose comme ça mais tout dépend de ce que tu veux exactement :
$sql='SELECT count(*)
      FROM blog
      WHERE day < (SELECT day
                   FROM blog
                   WHERE id = '.$id.')';
$res = mysql_query($sql);
$data = mysql_fetch_row($res);
$position = $data[0];
peut-être faut-il rajouter un $position++ à la fin ...

@+
dix2

Re: php/sql position d'une ligne dans une requête (classemen

Posté : 01 mai 2012, 09:21
par Zahnzao
Ah pas bête de compter simplement les résultats inférieurs. Je n'y avais pas pensé... J'imaginais cela autrement mais ca me semble une bonne solution.

Merci à toi.

Re: php/sql position d'une ligne dans une requête (classemen

Posté : 01 mai 2012, 20:22
par Zahnzao
Salut, et désolé du double post.

Cette méthode ne fonctionne pas à cause du tri. En effet, dans ma page de classement, si deux blogs ont la même valeur dans 'day' je trie par une autre colonne. J'aurai du le préciser. Et je ne vois pas comment reproduire ceci avec le count.

Donc il me faut bien un autre moyen de réaliser cela.

Pour que vous compreniez la situation je vous explique:

Je réalise un topsite de blogs utilisant la plateforme tumblr (grâce a l'api). J'ai 3 classements différents (classement du jour, de la semaine et du mois) qui sont remis à zero respectivement chaque jours, chaque lundi et chaque 1er du mois. Lorsque l'internaute clique sur un blog on arrive sur une page dédiée au blog et j'aimerai indiquer sur cette page, sa position dans chaque classements.

Mais j'ai un ordre de tri. Pour le jour, je trie par (day,week,month) pour la semaine (week,month,day) et pour le mois (month,week,day). Toutes ces valeurs sont des entiers incrémentés à chaque votes.

Voici par exemple la requête qui affiche mon classement du jour.
$sql='SELECT id,name,day FROM blog ORDER BY day DESC,week DESC,month DESC';
Et ma question est: comment récupérer facilement la position d'un blog dans mon classement sans boucler ? Surtout que j'ai 3 requête à effectuer.

J'ai un début de piste ici http://www.it-iss.com/mysql/mysql-runni ... -position/ mais je ne comprend pas très bien.

Merci ;)