JeuWeb - Crée ton jeu par navigateur
aide pour un requête un peu spéciale - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : aide pour un requête un peu spéciale (/showthread.php?tid=3788)



aide pour un requête un peu spéciale - php_addict - 11-11-2010

bonjour

je me permet de solliciter votre aide sur une requête un peu spéciale, je vais simplifier mon exemple au maximum pour une meilleur compréhension du smilblick :

voici la table nommée "matable"

[Image: sqlxg.jpg]

Je possède déjà la liste des village_id qui m'intéressent , exemple:

$liste=(82,116)

je voudrais récupérer les lignes suivant ces critères:

- les lignes dont village_id est dans la liste $liste
- et uniquement une seule ligne par élément de la liste $liste
- et dont le time est le plus récent...

graphiquement voici ce que je souhaite récupérer :

[Image: sql2d.jpg]

je ne vois pas du tout comment m'y prendre en une seule requête? une requête imbriquée peut être?

je vous remercies par avance d'avoir lu ce message et de tenter d'y trouver une solution, et j'espère avoir été assez clair...

bonne fin de journée !


RE: aide pour un requête un peu spéciale - atra27 - 11-11-2010

Je dirais...
ORDER BY time LIMIT 1

A tester avec ORDER BY DESC ou pas...

Et penser a mettre un index sur time Smile

Sa marche?


RE: aide pour un requête un peu spéciale - Myrina - 11-11-2010

Aucune garantie mais je verrai bien une requête du style

SELECT m.id,m.time,m.village_id FROM matable m where m.village_id IN ("$liste") AND m.time=(SELECT MAX(n.time) FROM matable n where n.village_id=m.village_id)

Attention, cette requête ne fonctionnera que si le couple (village_id,time) est unique; sinon le sous select peut renvoyé un ensemble, ce qui est incompatible avec un opérateur =.


RE: aide pour un requête un peu spéciale - niahoo - 12-11-2010

avec 'group by' ça te permetra de sélectionner le time maximum pour chaque village, par contre je ne sais pas si ça pourra te retourner le champ 'id' correctement.


RE: aide pour un requête un peu spéciale - srm - 12-11-2010

Comme toujours pour ce genre de question, merci de donner un dump du schéma et des données Smile
Pour mySQL :

SELECT test.* FROM test
INNER JOIN (
SELECT village_id, MAX(time) AS maxTime
FROM test
WHERE village_id in (82,116)
GROUP BY village_id
) gtest ON (test.village_id = gtest.village_id AND test.time_a = gtest.maxTime)

Et sur Postgresql :

SELECT id, time, village_id
FROM (
SELECT *, rank() OVER (PARTITION BY village_id ORDER BY time DESC)
FROM test WHERE village_id IN (82, 116)
) Bouh WHERE rank = 1



RE: aide pour un requête un peu spéciale - php_addict - 12-11-2010

merci à vous, je n'utilise que rarement MAX et GROUP BY et vous m'avez mis sur le bonne piste

encore merci Wink


RE: aide pour un requête un peu spéciale - srm - 12-11-2010

On voit aussi que c'est bien plus propre avec Postgresql Wink


RE: aide pour un requête un peu spéciale - Myrina - 13-11-2010

Juste pour info, c'est possible d'avoir la requête produite à partir de nos conseils?


RE: aide pour un requête un peu spéciale - php_addict - 14-11-2010

(13-11-2010, 10:00 PM)Myrina a écrit : Juste pour info, c'est possible d'avoir la requête produite à partir de nos conseils?

euh oui bien sur, c'est un truc du genre


SELECT MAX(id)
FROM matable
WHERE village_id IN $liste
GROUP BY village_id

ma requête est en réalité beaucoup plus complexe car il y a beaucoup de jointures additionnelles, et l'exemple que j'ai fournit plus haut était un exemple extrêmement simplifié de mes besoins


RE: aide pour un requête un peu spéciale - srm - 14-11-2010

Je ne vois pas comment ça peut convenir à ton besoin ce que tu montres ^^