0

我盯着这个看了好几个小时。我无法找到错误。谁能告诉我我做错了什么?或者有没有更好的比较方法?

$res1=mysql_query(**query for table1**);
$n1=mysql_num_rows($res1);
$res2=mysql_query(**query for table 2**);
$n2=mysql_num_rows($res2);

for($i=0;$i<$n1;$i++)
{
    $r1=mysql_fetch_row($res1);

    for($j=0;$j<$n2;$j++)
    {
        $r2=mysql_fetch_row($res2);
        if($r1[0]==$r2[0])
        {
            echo $r1[0]."<br>";
        }
    }
}

表 1 包含这些元素:1,2,3,16,18,19,20,21,22,24,23 表 2 包含:23,21

但是,该程序返回零匹配。为什么?

4

3 回答 3

1

所以这里发生的是

  1. 您正在正确循环结果 1 的所有 hte 元素,但您没有正确循环结果 2 的所有元素。

结果两个元素在第一次迭代中被耗尽。

从您发布的示例数据中,这里是循环:

当 r1 为 1 时,

r2 是 23,21

当 r1 为 2 时,

r2 已用尽。

要再次重置结果二,您必须这样做

mysql_data_seek($res2,0); 每一次

即你的for循环看起来像这样

for($i=0;$i<$n1;$i++) {

    $r1=mysql_fetch_row($res1);

    mysql_data_seek($res2,0);
    for($j=0;$j<$n2;$j++)     {
        $r2=mysql_fetch_row($res2);
        if($r1[0]==$r2[0])         {
           echo $r1[0]."<br>";
        }
    }
}
于 2013-01-26T10:34:55.100 回答
0

让数据库在单个查询中进行连接。这就是它们的用途,它们通常使用更有效的算法,例如,如果索引可用。

于 2013-01-26T10:32:48.403 回答
0

听起来你想要的是一个INNER JOIN. AJOIN是关系数据库的基本组件,它允许来自多个表的数据以不同的方式相交。

我最喜欢的JOINs 解释实际上来自于Bugzilla 文档——它们很好地解释了所有不同的类型。

在您的情况下,您的查询将如下所示:

SELECT
    table1.field1, table1.field2, ...,
    table2.field2, table2.field2, ...
FROM table1
INNER JOIN table2 ON (table1.id = table2.id)

我创建了一个SQL Fiddle供您阅读。

于 2013-01-26T10:38:00.043 回答