Domanda

Mettiamo un esempio semplice con due tavoli:

USERS (Id, Name, City)
PLAYERS (Id_Player, Number, Team)

E che devo fare una query con un subselect in un ciclo, dove la subselect è sempre lo stesso, quindi vorrei dividerlo in due query e mettere il subselect di fuori del ciclo.

spiego. Ciò che funziona ma non è 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')");
}

Quello che mi piacerebbe fare, ma non funziona:

$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**");
}

Grazie!

È stato utile?

Soluzione

Qualcosa del genere dovrebbe funzionare.

<?
$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>";

Altri suggerimenti

Immissione quaderni SQL in loop può essere molto lento e prendere un sacco di risorse, dare un'occhiata a utilizzando ENTRA in voi SQL. Non è così difficile e una volta che hai il blocco di esso è possibile scrivere un veramente veloce potente SQL.

Ecco un buon valore di esercitazione avere uno sguardo sui diversi tipi di 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

Non è il modo migliore per farlo; forse un LEFT JOIN, ma dovrebbe funzionare. Potrebbe avere il torto di sintassi però.

James

Modifica

ATTENZIONE: Questa non è la soluzione più ideale. Per favore mi dia una query più specifica e posso risolvere una query join per voi.

Prendendo il tuo commento in considerazione, diamo un'occhiata a un altro esempio. Questo userà PHP per fare una lista possiamo usare la parola MySQL IN.

In primo luogo, rendere la query:

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

Poi, scorrere la query e mettere ogni campo Id uno dopo l'altro in un elenco separato da virgole separati:

$player_ids = "";

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

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

Si dovrebbe ora avere un elenco di ID in questo modo:

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

Ora di mettere nella vostra seconda query:

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

L'esempio qui riportato può essere migliorata per specifico scopo di, però sto cercando di mantenere il più aperto possibile.

Se si vuole fare una lista di stringhe, non gli ID o altri numeri, modificare il primo ciclo while, sostituendo la linea interna con

$player_ids .= "'" . $row['Id'] . "',";

Se potesse darmi la query reale si utilizza, posso venire con qualcosa di meglio; come ho detto sopra, questo è un modo più generico di fare le cose, non necessariamente il migliore.

L'esecuzione di query in un ciclo, non è una grande idea. Molto meglio sarebbe quella di ottenere tutto il tavolo, e poi iterare attraverso tabella in loop.

Quindi interrogazione sarebbe qualcosa di simile:

"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**");
}

lavoro sarebbe, ma mysql_query() restituisce un handle RISULTATO. Esso non restituisce il valore id. Qualsiasi query di selezione, non importa quante, o pochi, le righe che restituisce, restituisce un risultato dichiarazione, non un valore. Dovete prima di recuperare la riga utilizzando una delle chiamate mysql_fetch...(), che restituisce quella riga, da cui è possibile estrarre il valore id. così ...

$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 ...
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top