我有一组嵌套的while循环,可以相互比较mysql查询。这是代码:
while($row = mysql_fetch_array($resultbat))
{
$drafted = 0;
while($crossedRow = mysql_fetch_array($crossedAnswer))
{
if($row['NAME'] == $crossedRow['name'])
{
$drafted = 1;
}
else
{
$drafted = 0;
}
}
if ($drafted == 1)
{
echo "<tr class='drafted' id='" . $row['NAME'] . "'>";
}
else if($n&1)
{
echo "<tr id='" . $row['NAME'] . "'>";
}else
{
echo "<tr class='alt' id='" . $row['NAME'] . "'>";
}
...}
$ resultbat是所有玩家的列表,而$ crossedAnswer是一些应该标记的玩家的列表。对于每个玩家,我想看看他们是否在$ crossedAnswer玩家列表中。如果他们是我想标记要起草的那个html元素的类。
提前致谢。
答案 0 :(得分:0)
我认为你要么:
打开来自$crossedAnswer
的每一行的$resultbat
上的光标(在每个循环开始时打开它,并在结尾处关闭它,这有效地为每个循环执行该查询在resultbat
)或
将$crossedAnswer
结果集中的所有行提取到结构中,并查看$resultbat
中每一行的结构(以避免对数据库多次运行相同的查询) ),或
确保$ resultbat和$ crossedAnswer按键值排序,并且只做一个循环;打开两个游标,从每个游标中获取一行,然后比较键值以确定哪个结果集“落后”,以及从哪个获取(这样更有效,但编写和测试的代码更复杂),或者< / p>
如果这些结果集来自同一个MySQL服务器,则将其重写为单个查询,让MySQL完成将行连接在一起的工作,并处理一个结果集。
就个人而言,我会选择最后一个。我会让MySQL进行连接,返回一个结果集,然后单个循环。
获取结果集的查询格式为:
SELECT b.*
, IF(a.name IS NOT NULL,1,0) AS drafted
FROM (
query_for_$resultbat
) b
LEFT
JOIN (
query_for_$crossedAnswer
) a
ON b.name = a.name
请注意,如果在a
中找到匹配的行,则drafted
列将返回1,否则返回0。
基于原始代码处理此结果集的代码可能是这样的:
while($row = mysql_fetch_array($result))
{
$class = "";
if($row['drafted'] == 1
{
$class = "class='drafted' ";
}
else if($n&1)
{
$class = "";
}
else
{
$class = "class='alt' ";
}
echo "<tr " . $class . " id='" . $row['NAME'] . "'>";
...
}