Page 1 sur 2

Requete sur requete ?

Posté : 18 juil. 2005, 11:29
par Antony
bonjour,
j'aimerai faire une requête sur une requête mais je ne sais pas si c'est possible, ça m'éviterais de passer par une table temporaire...
Ma première requête est construite ainsi :
$Requete = mysql_query("SELECT * FROM table ORDER BY RAND() LIMIT 0 , 6");

Et j'aimerai ensuite trier ce résultat par Numéro. J'ai essayé de faire ça :
$Requete = mysql_query("SELECT * FROM $Requete ORDER BY Num");

evidemment ça ne marche pas, mais ça dois etre possible de faire qqchose comme ça non ? :lol:

Posté : 18 juil. 2005, 11:30
par ouckileou
comme ça ça ne marchera pas mais pourquoi ne pas trier directement par numéro ?

si tu veux prendre 6 enregistrements au hasard puis les ordonner par numéro essaye à la suite :

Code : Tout sélectionner

SELECT ù FROM table ORDER BY RAND(), numero LIMIT 0,6
édition : en fait ça ne semble pas marcher

Posté : 18 juil. 2005, 11:31
par mere-teresa
$Requete est un pointeur de résultat, et en aucun cas un nom de table existant dans la base de données.
Si la 1ere requête te récupère un nom de table, il faut traiter les résultats. Mais je pense que tu veux chercher un résultat dans les résultats de la 1ere requête, c'est ça ?

Posté : 18 juil. 2005, 11:36
par Antony
c'est la première chose que j'ai essayé ouckileou mais non ça ne marche pas. Je peux par contre faire ORDER BY Num, RAND() mais là ça ne me retourne pas ce que je veux...
mere-teresa, ce n'est pas exactement ça. Ma première requête me donne une liste de ma base de façon aléatoire et ensuite j'aimerai trier cette liste par numéro.

Posté : 18 juil. 2005, 11:40
par ouckileou
alors personnellement je ne vois que ces solutions :
- faire une sous requête
- trier ces choix en PHP : mois optimal mais comme tu n'en prends que 6 ça devrait aller

sinon je ne sais pas désolé :roll:

Posté : 18 juil. 2005, 11:42
par Antony
Comment ça une sous-requête ? Je pensais plutot à une table temporaire au début mais ça m'embête de passer par là à cause du temps de chargement...

Posté : 18 juil. 2005, 11:47
par ouckileou
un truc de ce genre là :

Code : Tout sélectionner

SELECT * FROM (SELECT * FROM `table` ORDER BY RAND() LIMIT 0 , 6) AS sous_requete ORDER BY numero
c'est une suggestion, à tester :)

Posté : 18 juil. 2005, 11:51
par mere-teresa
Ma première requête me donne une liste de ma base de façon aléatoire et ensuite j'aimerai trier cette liste par numéro.
Utilises le sort() de PHP et fais un mysql_fetch_array ===> tu auras un tableau de résultats, donc un tableau de $tablo_res['lenumero'] et tu pourras classer ces chiffres !
http://fr.php.net/manual/fr/function.sort.php

Posté : 18 juil. 2005, 12:38
par raptor

Code : Tout sélectionner

select * from table t1 inner join (select Num from table order by rand() limit 6) t2 on t2.Num=t1.Num order by t1.Num asc;
@+

Posté : 18 juil. 2005, 13:11
par Antony
J'ai essayé ta requete Raptor ça me renvoie une erreur (Warning: mysql_fetch_array(): supplied argument is not a valid MySQL...). Je ne pense pourtant pas avoir fait d'erreur :
$Requete = mysql_query("SELECT * FROM cartes t1 inner join (select Num from cartes ORDER BY RAND() LIMIT 0 , 6) t2 on t2.Num=T1.Num order by t1.Num asc");
while ($rows = mysql_fetch_array($Requete)){
$Image = $rows['Point'];
echo "<a href='$Image' target='_blank'><img src='$Image' border='1'></a>&nbsp;&nbsp;";
}

Je vais essayer la proposition de mere teresa...on verra bien.

Posté : 18 juil. 2005, 13:33
par zeus
Il faut que tu fasses attention à la version de MySQL que tu utilise puisque les sous-requêtes ne fonctionnent qu'a partir de la version 4.1 :wink:

Posté : 18 juil. 2005, 13:49
par Antony
lol merci pour l'info je suis chez free la version est la 4.0.22... c'est ballo... Il me reste quoi comme solution ? :?

Posté : 18 juil. 2005, 13:55
par zeus
Essaye celle de mere-teresa
Ma première requête me donne une liste de ma base de façon aléatoire et ensuite j'aimerai trier cette liste par numéro.
Utilises le sort() de PHP et fais un mysql_fetch_array ===> tu auras un tableau de résultats, donc un tableau de $tablo_res['lenumero'] et tu pourras classer ces chiffres !
http://fr.php.net/manual/fr/function.sort.php

Posté : 18 juil. 2005, 14:53
par raptor
ok désolé pour la version

alors :
$req = mysql_query("select Num from table order by rand() limit 6");

$total = mysql_num_rows($req);
if ($total==0) {
  echo "pas de résultat";
} else {
  $liste = "";
  while ($res = mysql_fetch_array($req)) {
   $liste.="|"$res["Num"];
  }
  $liste = substr($liste,1);
  $req2 = mysql_query("select * from table where Num REGEXP '^(".$liste.")$' order by Num asc");
  
  /* Ici le traitement du resultat de la requete */

}

@++

Posté : 18 juil. 2005, 15:50
par Antony
Si je fais ton code Raptor j'ai une erreur à la ligne 8 (parse error T_VARIABLE...) que j'ai réussi à corriger en faisant ceci :
$liste.= "|" & $res["Num"];

Mais ensuite quand j'effectue le traitement du résultat de la requete comme ceci :
while ($rows = mysql_fetch_array($req2)){
$Image = $rows['Num'];
echo $Image;
}
il m'affiche cette erreur : Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result...
J'ai essayé de changer quelques trucs mais je comprends pas tout à ton code et j'aime bien comprendre ce que je met : ça sert à quoi cette commande "REGEXP '^(".$liste.")$" ? Merci encore pour votre aide à tous.