2

我有一个包含以下字段的表:

row_id    
first_field
second_field

row_id 是整数类型,设置为自动递增并且是主键。其他两个字段是文本类型。

该表最多填充五行。因此,row_id 的值为 1、2、3、4 和 5。

我还有另一个类似结构的表,它与我的第一个表具有一对多的对应关系。

但是当我进行选择查询并将结果提供给 mysql_fetch_array 时,会发生一些奇怪的事情。

当我运行这个:

$query = "select a.*, b.* from table1 as a
         left join table2 as b on a.row_id = b.row_id";
$result = mysql_query($query) or die(mysql_error());
while ($row = mysql_fetch_array($result)) {
    echo '<pre>'; print_r($row); echo '</pre>';
}

我明白了:

Array
(
    [0] => 1
    [row_id] => 1
    [1] => some text
    [first_field] => some text
    [2] => some text
    [second_field] => some text 
}


Array
(
    [0] => 2
    [row_id] => 2
    [1] => some text
    [first_field] => some text
    [2] => some text
    [second_field] => some text 
}


Array
(
    [0] => 3
    [row_id] => 
    [1] => some text
    [first_field] => some text
    [2] => some text
    [second_field] => some text 
}


Array
(
    [0] => 4
    [row_id] => 
    [1] => some text
    [first_field] => some text
    [2] => some text
    [second_field] => some text 
}


Array
(
    [0] => 5
    [row_id] => 
    [1] => some text
    [first_field] => some text
    [2] => some text
    [second_field] => some text 
}

对于每个数组结果,我想将您的注意力引向第一个字段 row_id。在前两个数组中,索引 0 和 row_id 具有相同的值,而在随后的三个数组中,只有索引 0 具有值。row_id 似乎为空。

这是我第一次遇到这样的事情。这是什么原因造成的?如何解决?

谢谢!

4

1 回答 1

1

LEFT JOIN这与您在查询中编辑了另一个表的事实有关。

使用 a LEFT JOIN,第一个表中没有第二个表中匹配行的行将在JOINed 字段中填充NULL值。

因为您在两个表中都有一个列row_id,并且您已经*从两个表中进行了选择,所以后面的值row_id将覆盖结果中的前面的值。table2中的第 3、4 和 5 行似乎没有匹配的行table1。这导致 NULL row_id

解决方案是选择row_id您想要的,并且有多种方法可以做到这一点。但是对于这样一组相对简单的结果,我建议您明确说明您想要的所有列:

SELECT a.*, b.col_1, b.col_2
FROM table1 a
LEFT JOIN table2 b ON a.row_id = b.row_id

或者,您可以LEFT从连接中删除 ,结果中将省略第 3、4 和 5 行。

于 2012-04-05T15:38:44.603 回答