Question

METTONS un exemple simple avec deux tableaux:

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ù le sous-sélection est toujours le même, donc je voudrais le diviser en deux requêtes et de mettre l'subselect en dehors de la boucle.

J'explique. Ce qui fonctionne, mais il n'est pas optimize:

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!

Était-ce utile?

La solution

Quelque chose comme cela devrait fonctionner.

<?
$sql = "SELECT Team from PLAYERS 
    JOIN USERS on (Id_player=Id)
    WHERE Number BETWEEN $minID AND $maxID
    AND City='London'
    GROUP BY Team";

$results=mysql_query($sql) or die(mysql_error());


// $results contain all the teams from London
// Use like normal..

echo "<ul>\n";

while($team = mysql_fetch_array($results)){
    echo "\t<li>{$team['Team']}</li>\n";
}

echo "</ul>";

Autres conseils

Placer SQL dans cahiers des boucles peut être très lent et prendre beaucoup de ressources, jetez un oeil à l'aide JOIN dans SQL vous. Il est pas si difficile et une fois que vous avez le coup de lui, vous pouvez écrire quelques SQL vraiment rapide puissant.

Voici un bon tutoriel vaut avoir un regard sur les différents types de JOIN:
http://www.keithjbrown.co.uk/vworks/mysql/mysql_p5.php

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 mauvaise syntaxe bien.

James

EDIT

ATTENTION: Ce n'est pas la solution la plus idéale. S'il vous plaît me donner une requête plus spécifique et je peux trier une requête join pour vous.

Prendre votre commentaire en compte, nous allons jeter un oeil à un autre exemple. Cela utiliser PHP pour faire une liste que nous pouvons utiliser avec le mot-clé IN MySQL.

Tout d'abord, faites votre requête:

$res1 = mysql_query("SELECT Id from USERS where City='London'");

Ensuite, boucle à travers votre requête et mettre chaque champ Id l'un après l'autre dans une virgule liste seperated:

$player_ids = "";

while($row = mysql_fetch_array($res1))
{
    $player_ids .= $row['Id'] . ",";
}

$player_ids = rtrim($player_ids, ",");

Vous devriez maintenant avoir une liste d'ID comme ceci:

12, 14, 6, 4, 3, 15, ...

Maintenant, pour la mettre dans votre deuxième requête:

for($i = 0; $i<something; $i++) 
{      
    $res2 = mysql_query("SELECT Team from PLAYERS WHERE Number=$i          
    AND Id_Player IN $player_ids"); 
}

L'exemple donné ici peut être améliorée à des fins spécifique de lui, mais je suis en train de le garder aussi ouvert que possible.

Si vous voulez faire une liste de chaînes, pas de numéros ou d'autres numéros, modifier la première boucle de while, 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 plus haut, c'est une façon plus générique de faire les choses, pas nécessairement le meilleur.

L'exécution requête dans une boucle est pas une bonne idée. Beaucoup mieux serait d'obtenir tablée, puis itérer à travers la table en boucle.

requête serait quelque chose comme ça:

"SELECT Team from PLAYERS WHERE Number BETWEEN($id, $something) 
        AND Id_Player IN (SELECT Id FROM USERS WHERE City='London')"
$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**");
}

travaillerais, mais mysql_query() renvoie un jeu de résultats. Il ne retourne pas la valeur id. Toute requête de sélection, peu importe le nombre, ou peu, les lignes qu'elle renvoie, retourne une déclaration de résultat, pas une valeur. Vous devez d'abord chercher la ligne en utilisant l'un des appels mysql_fetch...(), qui retourne cette ligne, à partir de laquelle vous pouvez extraire la valeur id. alors ...

$stmt = mysql_query("select ID ...");
if ($stmt === FALSE) {
    die(msyql_error());
}
if ($stmt->num_rows > 0) {
    $ids = array();
    while($row = mysql_fetch_assoc($stmt)) {
        $ids[] = $row['id']
    }
    $ids = implode(',', $ids)
    $stmt = mysql_query("select TEAM from ... where Id_player IN ($ids)");
    .... more fetching/processing here ...
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top