Requête résultat aléatoire

Requête résultat aléatoire - SQL/NoSQL - Programmation

Marsh Posté le 03-08-2010 à 09:59:13    

Bonjour,
Je suis en train de réaliser une web-logiciel de gestion de tournois or j'ai un petit soucis avec une requête.
 
Voici un extrait de la table RESULTAT

Code :
  1. id idTournois idAnnee j1 j2   num
  2. 1 1          1          1 2     6401
  3. 2 1          1          8 4     6402


 
Voici un extrait de la table JOUEUR
 

Code :
  1. id prenomJ nomJ
  2. 1           Roger          Federer
  3. 2           Peter       Luczak
  4. 4           Alejandro     Falla
  5. 8           Janko     Tipsarevic


 
Je souhaiterais afficher le nom de joueurs dans l'ordre suivant
FEDERER
LUCZAK
TIPSAREVIC
FALLA
 
c'est à dire parcourir le champ J1 puis le champ J2 dans l'ordre croissant du champ num
 
Voici ma requête... qui ne fonctionne pas. En réalité elle fonctionne "un peu" mais dès que le nombre d'enregistrements est élevé, l'ordre d'affichage est aléatoire et change selon les rafraichissements ..
 

Code :
  1. SELECT J.nomJ FROM joueur as J, resultat as R
  2.  WHERE (J.id = R.j1
  3.  OR J.id = R.j2)
  4.  ORDER BY R.id, R.j1 ASC


 
Merci

Reply

Marsh Posté le 03-08-2010 à 09:59:13   

Reply

Marsh Posté le 03-08-2010 à 11:14:38    

Essayes avec cette requête :
SELECT J1.NomJ FROM joueur J1 inner join resultat R1 ON J1.id = R1.j1
UNION SELECT J2.NomJ FROM joueur J2 inner join resultat R1 ON J2.id = R2.j2
ORDER BY R.id, J1.id, J2.if


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 03-08-2010 à 12:42:01    

SELECT J1.NomJ  
FROM joueur J1 inner join resultat R1  
ON J1.id = R1.j1  
UNION  
SELECT J2.NomJ  
FROM joueur J2 inner join resultat R1  
ON J2.id = R1.j2
 
Marche parfaitement rufo merci
Peux-tu m'expliquer le inner join on ?

Reply

Marsh Posté le 03-08-2010 à 12:46:46    

Ah ben non en fait ça marche pas ...
J'avais viré le order car il me disait  
"#1054 - Unknown column 'R.id' in 'order clause'"
(j'ai par contre modifié J2.if en J2.id)

Reply

Marsh Posté le 03-08-2010 à 14:03:12    

Pardon, R1 pas R dans le order by :
SELECT J1.NomJ FROM joueur J1 inner join resultat R1 ON J1.id = R1.j1
UNION SELECT J2.NomJ FROM joueur J2 inner join resultat R1 ON J2.id = R2.j2
ORDER BY R1.id, J1.id, J2.id
http://dev.mysql.com/doc/refman/5.0/fr/union.html


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 03-08-2010 à 15:21:42    

erreur une petite erreur :  
#1054 - Unknown column 'R2.j2' in 'on clause'
et si je remplace R2.j2 par R1.j2  
j'obtiens
#1054 - Unknown column 'R1.id' in 'order clause'

Reply

Marsh Posté le 03-08-2010 à 15:37:46    

au fait, inner join, ça la méthode normale pour faire des équi-jointures. Mais souvent les profs nous font faire les équi-jointures dans le where :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 03-08-2010 à 16:10:14    

Bon, j'ai une solution :

Code :
  1. SELECT nomJ, ((r.id * 1000) + (j.id * 100)) AS Rank FROM Joueur j INNER JOIN Resultat r ON (j.id = r.j1)
  2. UNION
  3. SELECT nomJ, ((r.id * 1000) + (j.id * 300)) AS Rank FROM Joueur j INNER JOIN Resultat r ON (j.id = r.j2)
  4. ORDER BY Rank


Après, suivant la taille de ta BD, faudra sans doute adapter les nombres 1000, 100 et 300. Si t'as plus de 100 joueurs, faudra mettre 1000 à la place de 100 et 3000 à la place de 300, 10000 à la place de 1000.
 
Mais y'a peut-être mieux ou plus simple...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 03-08-2010 à 22:51:12    

Héhé j'ai trouvé a peu de choses près la même requête que toi ! Ca me plaisait bien mais bon c'est vraiment crade je trouve et je suis persuadé qu'il y a une autre solution mais merci beaucoup, cela fonctionne

Reply

Marsh Posté le 04-08-2010 à 01:12:05    

Hu hu hu, bon je précise que c'était juste pour essayer, je dis pas que ca va tout casser niveau performance!

SELECT j.nomJ
FROM joueur j
CROSS JOIN (SELECT 1 AS n FROM dual UNION ALL SELECT 2 FROM dual) cj
INNER JOIN resultat r ON (j.id = CASE WHEN cj.n=1 THEN r.j1 ELSE r.j2 END)
ORDER BY r.id, cj.n;


Le CASE/WHEN/THEN/ELSE/END marche sous Oracle, je sais pas si c'est dans la norme SQL donc pas garanti pour d'autres SGBD m'enfin s'il n'y a pas exactement ca, il y aura un truc équivalent...


Message édité par lasnoufle le 04-08-2010 à 01:13:09

---------------
C'était vraiment très intéressant.
Reply

Marsh Posté le 04-08-2010 à 01:12:05   

Reply

Marsh Posté le 04-08-2010 à 09:34:05    

Le CASE existes aussi sous mysql.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed