2011-01-14 10 views
2

Lassen Sie uns ein einfaches Beispiel mit zwei Tischen setzen:Subquery in PHP

Und ich habe eine Abfrage mit einem subselect in einer Schleife zu tun, wo die subselect immer die gleiche ist, so möchte ich teilen es in zwei Abfragen und setzen Sie den Subselect außerhalb der Schleife.

Ich erkläre. Was funktioniert, aber es ist nicht optimieren:

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

Was möchte ich tun, aber es funktioniert nicht:

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

Dank!

+0

Warum möchten Sie zwei Abfragen statt einer machen? Eine Abfrage mit einem Subselect wäre schneller als zwei eigenständige. Können Sie uns auch sagen, welchen Fehler Sie bekommen? – thomaux

Antwort

2

So etwas sollte funktionieren.

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

SELECT PLAYERS.*, USERS.City FROM PLAYERS, USERS WHERE USERS.City='London' AND PLAYERS.Number = $i

nicht der beste Weg, es zu tun; vielleicht ein LEFT JOIN, aber es sollte funktionieren. Könnte die Syntax falsch haben.

James

EDIT

ACHTUNG: Dies ist nicht die ideale Lösung. Bitte geben Sie mir eine genauere Abfrage und ich kann eine join Abfrage für Sie aussortieren.

Nehmen wir Ihren Kommentar in Betracht, schauen wir uns ein anderes Beispiel an. Dies wird PHP verwenden, um eine Liste zu erstellen, die wir mit dem Schlüsselwort MySQL IN verwenden können.

Stellen Sie zunächst Ihre Frage:

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

Dann Schleife durch Ihre Anfrage und setzen jedes Id Feld nacheinander in ein Komma getrennte Liste:

 
$player_ids = ""; 

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

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

Sie sollten jetzt haben eine Liste von IDs wie folgt:

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

Nun ist es in Ihre zweite Abfrage zu setzen:

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

Das hier gegebene Beispiel verbessert werden kann, für sie bestimmten Zweck sind, aber ich versuche es so offen wie möglich zu halten.

Wenn Sie eine Liste von Zeichenketten machen wollen, nicht-IDs oder andere Zahlen, ändern Sie die erste while Schleife, im Inneren der Leitung zu ersetzen mit

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

Wenn Sie Ihren tatsächlichen Abfrage geben könnte mir benutze ich etwas Besseres; Wie ich oben sagte, ist dies eine generische Art, Dinge zu tun, nicht unbedingt die beste.

+0

Danke, aber stellen wir uns vor, dass $ res1 viel komplizierter war und ohne Bezug zur Schleife. Dann wäre es nicht sehr optimiert wie du sagst, oder? Weil es in jeder Iteration die "USERS.City = 'London'" bewerten muss. DANKE – Arturo

2

Das Platzieren von SQL-Abfragen in Schleifen kann sehr langsam sein und eine Menge Ressourcen beanspruchen. Schauen Sie sich JOIN in SQL an. Es ist nicht so schwierig und sobald Sie den Dreh raus haben, können Sie ein paar sehr schnelle, mächtige SQL schreiben.

ist hier ein gutes Tutorial lohnt sich, einen Blick auf über die verschiedenen Arten von mit Joins:
http://www.keithjbrown.co.uk/vworks/mysql/mysql_p5.php

+0

Eine sehr gute Idee. Meine Antwort ist eher ein Zwischenschritt, um das OP dazu zu bringen, 'JOIN' zu verwenden; Schleifenabfragen können manchmal schrecklich sein. – Bojangles

1

Lauf Abfrage in einer Schleife ist keine gute Idee. Viel besser wäre es, die ganze Tabelle zu bekommen und dann durch die Tabelle in der Schleife zu iterieren.

So würde Abfrage so ähnlich sein:

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

funktionieren würde, aber mysql_query() gibt ein Ergebnis GRIFF. Es gibt den Wert id nicht zurück. Jede ausgewählte Abfrage, egal wie viele oder wenige Zeilen sie zurückgibt, gibt eine Ergebnisanweisung zurück, keinen Wert. Sie müssen zuerst die Zeile mit einem der Aufrufe mysql_fetch...() abrufen, die diese Zeile zurückgibt, aus der Sie dann den ID-Wert extrahieren können. so ...

$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 ... 
}