Sous-requête en PHP
Mettons un exemple simple, avec deux tables:
USERS (Id, Name, City)
PLAYERS (Id_Player, Number, Team)
Et je dois faire une requête avec une sous-sélection dans une boucle, où celle-ci est toujours le même, donc, je tiens à le diviser en deux requêtes et de mettre celle-ci en dehors de la boucle.
Je vais vous expliquer. Ce qui fonctionne, mais il n'est pas optimiser:
for($i=0;$i<something;$i++)
{
$res2=mysql_query("SELECT Team from PLAYERS WHERE Number=$i
AND Id_Player IN (SELECT Id FROM USERS WHERE City='London')");
}
Ce que je voudrais faire, mais il ne fonctionne pas:
$res1=mysql_query("SELECT Id from USERS where City='London'");
for($i=0;$i<something;$i++)
{
$res2=mysql_query("SELECT Team from PLAYERS WHERE Number=$i
AND Id_Player IN **$res1**");
}
Merci!
Pourquoi voudriez-vous faire deux requêtes au lieu d'une seule? Une requête avec une sous-sélection serait plus rapide, puis deux autonome. Aussi, pouvez-vous dire uswhat d'erreur que vous obtenez?
OriginalL'auteur Arturo | 2011-01-14
Vous devez vous connecter pour publier un commentaire.
Quelque chose comme cela devrait fonctionner.
OriginalL'auteur Ollie
Placer SQL cahiers des boucles peut être très lent et qui prend beaucoup de ressources, ont un coup d'oeil à l'aide de REJOINDRE en vous SQL. Il n'est pas difficile et une fois que vous avez obtenu le coup de lui, vous pouvez écrire quelques très rapide puissant SQL.
Voici un bon tutoriel mérite un coup d'œil sur les différents types de Jointures:
http://www.keithjbrown.co.uk/vworks/mysql/mysql_p5.php
JOIN
; boucle requêtes peut être horrible parfois.OriginalL'auteur Owen
SELECT PLAYERS.*, USERS.City FROM PLAYERS, USERS WHERE USERS.City='London' AND PLAYERS.Number = $i
Pas la meilleure façon de le faire; peut-être un
LEFT JOIN
, mais il devrait fonctionner. Pourrait avoir la syntaxe mal.James
MODIFIER
AVERTISSEMENT: Ce n'est pas la solution idéale. Merci de me donner une requête plus précise et je peux trier un
join
requête pour vous.De prendre votre commentaire en compte, nous allons jeter un oeil à un autre exemple. Cela permettra d'utiliser le PHP pour faire une liste que l'on peut utiliser avec MySQL
IN
mot-clé.Tout d'abord, faire de votre requête:
$res1 = mysql_query("SELECT Id from USERS where City='London'");
Puis, en boucle par le biais de votre requête et de placer chaque
Id
champ l'un après l'autre dans une séparation par virgule liste:Vous devriez maintenant avoir une liste d'Id comme ceci:
12, 14, 6, 4, 3, 15, ...
Maintenant pour le mettre dans votre deuxième requête:
L'exemple donné ici peut être amélioré pour l'objectif spécifique, cependant, je vais essayer de rester le plus ouvert possible.
Si vous souhaitez créer une liste de chaînes, pas de papiers d'identité ou d'autres numéros, de modifier le premier
while
boucle, en remplacement de la ligne à l'intérieur avec$player_ids .= "'" . $row['Id'] . "',";
Si vous pouviez me donner votre requête réelle que vous utilisez, je peux venir avec quelque chose de mieux, comme je l'ai dit ci-dessus, c'est plus générique façon de faire les choses, pas nécessairement la meilleure.
OriginalL'auteur Bojangles
D'exécution d'une requête dans une boucle n'est pas une bonne idée. Bien mieux serait d'obtenir toute la table, et puis itérer sur le tableau dans la boucle.
Donc, la requête serait quelque chose comme ça:
OriginalL'auteur mlusiak
Mais
mysql_query()
renvoie un RÉSULTAT de la POIGNÉE. Il ne retourne pas leid
valeur. Toute requête de sélection, peu importe la façon dont beaucoup ou peu de, rangs il retourne, retourne une déclaration de résultat, pas une valeur. Vous devez d'abord chercher la ligne à l'aide de l'un desmysql_fetch...()
appels, qui retourne la ligne, à partir de laquelle vous pouvez ensuite extraire la valeur de l'id. alors...OriginalL'auteur Marc B