2

让我们用两个表举一个简单的例子:

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

而且我必须在循环中使用子选择进行查询,其中子选择始终相同,因此我想将其分为两个查询并将子选择放在循环之外。

我解释。什么有效但未优化:

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

不是最好的方法;也许 a LEFT JOIN,但它应该工作。不过可能语法错误。

詹姆士

编辑

警告:这不是最理想的解决方案。请给我一个更具体的查询,我可以为您整理一个join查询。

考虑到您的评论,让我们看另一个示例。这将使用 PHP 创建一个我们可以与 MySQLIN关键字一起使用的列表。

首先,进行查询:

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

然后,遍历您的查询并将每个Id字段一个接一个地放在逗号分隔的列表中:

$player_ids = "";

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

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

您现在应该有一个这样的 ID 列表:

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

现在把它放到你的第二个查询中:

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 查询放在循环中可能会非常慢并且占用大量资源,请查看在 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()返回一个结果句柄。它不返回id值。任何选择查询,无论它返回多少行或多少行,都返回一个结果语句,而不是一个值。您首先必须使用其中一个调用来获取该行,该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 回答