2

2 つのテーブルを使用した簡単な例を示します。

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

そして、サブセレクトが常に同じであるループ内でサブセレクトを使用してクエリを実行する必要があるため、2 つのクエリに分割して、サブセレクトをループの外に配置したいと考えています。

私は説明する。何が機能しますが、最適化されません:

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

私がやりたいことですが、うまくいきません:

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

ありがとう!

4

5 に答える 5

1

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

それを行うための最良の方法ではありません。多分LEFT JOIN、しかしそれはうまくいくはずです。ただし、構文が間違っている可能性があります。

ジェームズ

編集

警告:これは最も理想的な解決策ではありません。より具体的な質問をお願いします。質問を整理することができjoinます。

コメントを考慮して、別の例を見てみましょう。これはPHPを使用して、MySQLINキーワードで使用できるリストを作成します。

まず、クエリを作成します。

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

次に、クエリをループして、各Idフィールドをコンマ区切りのリストに次々に配置します。

$ player_ids = "";

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

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

これで、次のようなIDのリストが作成されます。

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

次に、それを2番目のクエリに入れます。

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

ここに示した例は、特定の目的のために改善することができますが、可能な限りオープンに保つようにしています。

IDやその他の数値ではなく文字列のリストを作成する場合は、最初のwhileループを変更して、その中の行を次のように置き換えます。

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

使用している実際のクエリを教えていただければ、もっと良いものを思いつくことができます。上で述べたように、これは物事を行うためのより一般的な方法であり、必ずしも最善ではありません。

于 2011-01-14T12:55:04.117 に答える
1

SQL quire をループに配置すると、非常に遅くなり、多くのリソースが消費される可能性があります。SQL で JOIN を使用する方法を検討してください。それほど難しくはありません。コツをつかめば、非常に高速で強力な SQL を記述できます。

さまざまなタイプの JOIN について、一見の価値がある優れたチュートリアルを次に示します:
http://www.keithjbrown.co.uk/vworks/mysql/mysql_p5.php

于 2011-01-14T13:00:31.387 に答える
1

このようなものがうまくいくはずです。

<?
$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>";
于 2011-01-14T14:22:02.037 に答える
0

クエリをループで実行するのは良い考えではありません。テーブル全体を取得してから、ループ内のテーブルを反復処理する方がはるかに優れています。

したがって、クエリは次のようになります。

"SELECT Team from PLAYERS WHERE Number BETWEEN($id, $something) 
        AND Id_Player IN (SELECT Id FROM USERS WHERE City='London')"
于 2011-01-14T13:09:32.620 に答える
-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**");
}

動作しmysql_query()ますが、RESULT HANDLE を返します。値は返しませんid。選択クエリは、返される行の数に関係なく、値ではなく結果ステートメントを返します。まず、呼び出しの 1 つを使用して行をフェッチするmysql_fetch...()必要があります。これにより、その行が返され、そこから id 値を抽出できます。それで...

$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 ...
}
于 2011-01-14T13:09:59.677 に答える