Pregunta

Vamos a poner un ejemplo sencillo con dos tablas:

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

Y tengo que hacer una consulta con una subselección en un bucle, donde la subselección es siempre el mismo, así que me gustaría que dividirlo en dos consultas y poner la subselección fuera del bucle.

Me explico. Lo que funciona, pero no es Optimizar:

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

Lo que me gustaría hacer pero no lo hace el trabajo:

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

Gracias!

¿Fue útil?

Solución

Algo como esto debería funcionar.

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

Otros consejos

La colocación de manos de papel SQL en bucles puede ser muy lento y tomar una gran cantidad de recursos, echar un vistazo a utilizar se unen en que SQL. No es tan difícil y una vez que tienes la caída de ella puede escribir algún muy rápido de gran alcance de SQL.

Aquí es un buen tutorial vale la pena echar un vistazo a los diferentes tipos de combinaciones:
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

No es la mejor manera de hacerlo; tal vez un LEFT JOIN, pero debería funcionar. Podría tener la sintaxis incorrecta sin embargo.

James

Editar

ADVERTENCIA: Esta no es la solución más idónea. Por favor, dame una consulta más específica y puedo resolver una consulta join para usted.

Teniendo en cuenta su comentario, vamos a echar un vistazo a otro ejemplo. Esto usar PHP para hacer una lista que podemos utilizar con la palabra clave MySQL IN.

En primer lugar, hacer su consulta:

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

A continuación, bucle a través de la consulta y poner cada campo Id uno tras otro en una lista separada por comas separados:

$player_ids = "";

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

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

Ahora debería tener una lista de ID de esta manera:

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

Ahora, para ponerlo en su segunda consulta:

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

El ejemplo dado aquí se puede mejorar para su propósito específico, sin embargo estoy tratando de mantenerlo lo más abierto posible.

Si desea hacer una lista de cadenas, no identificadores u otros números, modificar el primer bucle while, en sustitución de la línea interior con

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

Si usted me podría dar a su consulta real que utiliza, que puede llegar a algo mejor; como he dicho anteriormente, esta es una manera más genérica de hacer las cosas, no necesariamente la mejor.

Ejecutar consulta en un bucle no es una gran idea. Mucho mejor sería la de obtener toda la tabla, y luego iterar a través de la mesa en bucle.

Así consulta sería algo así:

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

trabajo sería, pero mysql_query() devuelve un manejador del resultado. No devuelve el valor id. Cualquier consulta de selección, no importa cuántos o pocos, que devuelve filas, devuelve un estado de resultados, no un valor. Primero hay que buscar la fila utilizando una de las llamadas mysql_fetch...(), que devuelve la fila, desde la que se puede extraer el valor id. así que ...

$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 ...
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top