Subquery in PHP
-
11-10-2019 - |
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!
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 ...
}