Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL:具有相同列的表的左连接_Php_Mysql - Fatal编程技术网

Php MySQL:具有相同列的表的左连接

Php MySQL:具有相同列的表的左连接,php,mysql,Php,Mysql,以下是3个MySQL表: CREATE TABLE `t1` ( `id` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`) ); CREATE TABLE `t2` ( `id` int(11) NOT NULL, `a` int(11) NOT NULL, `b` int(11) NOT NULL, PRIMARY KEY (`id`) ); CREATE TABLE `t3` ( `id` int(1

以下是3个MySQL表:

CREATE TABLE `t1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
);


CREATE TABLE `t2` (
  `id` int(11) NOT NULL,
  `a` int(11) NOT NULL,
  `b` int(11) NOT NULL,
  PRIMARY KEY (`id`)
);


CREATE TABLE `t3` (
  `id` int(11) NOT NULL,
  `b` int(11) NOT NULL,
  `c` int(11) NOT NULL,
  PRIMARY KEY (`id`)
);
我想从以下表格中获取所有数据:

select * from t1
left join t2 on t1.id=t2.id
left join t3 on t1.id=t3.id;
结果是(表中有一些随机数据):

我正在使用mysqli_result::fetch_对象(PHP)检索和处理数据:

$mysqli = new mysqli('localhost', 'root', '', 'test');

$result = $mysqli->query('select * from t1
    left join t2 on t1.id=t2.id
    left join t3 on t1.id=t3.id;');

var_dump($result->fetch_object());
var_dump($result->fetch_object());
所以我有2个对象,但有些列是空的:

object(stdClass)[3]
  public 'id' => null
  public 'a' => string '42' (length=2)
  public 'b' => null
  public 'c' => null
object(stdClass)[3]
  public 'id' => string '2' (length=1)
  public 'a' => null
  public 'b' => string '43' (length=2)
  public 'c' => string '43' (length=2)
我可以理解为什么会发生这种情况(有些列具有相同的名称),但我希望只有非空值​​! 在我的例子中,我有更多的表和更多的列。我不能在列上使用别名,因为我在PHP代码中是“盲”的:我想使用
b
,而不是
b
的别名


因此,我希望在该查询中“首选”非空值(没有其他顺序规则)。

指定字段,并使用
coalesce
函数获取其中一个的值:

select 
  coalesce(t2.b, t3.b) as b,
  coalesce(t2.c, t3.c) as c
from t1
left join t2 on t1.id=t2.id
left join t3 on t1.id=t3.id;
但是请注意,如果两个'b'都不是null,那么您只会得到t2中的一个。Ans如果两者都为null,则结果仍然为null

PS:MySQL还具有
IFNULL
功能。但是IFNULL只接受两个值,并且它对其他数据库的可移植性较差,所以我更喜欢自己合并。

使用
->fetch(PDO::fetch_NUM)
。这将获取一个带编号的数组,而不是字符串键,因此您不会让“重复”的字段名相互覆盖。在查询结果中,每个字段将获得一个数组条目。但是您必须非常小心地将这些数组项映射回查询,因为
$row[7]
恰好是查询中的哪个字段?没有办法真正确定

更好的选择是在查询中为字段别名,这样它们就有了唯一的名称:

SELECT t1.a AS t1a, t2.2 AS t2a, etc...

yipes-您能显示您的预期输出吗?
IFNULL
具有相同的行为,但速度稍快,但只需要两个参数,而
COALESCE
需要两个或更多参数。
SELECT t1.a AS t1a, t2.2 AS t2a, etc...