这是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;
结果是(表中有一些随机数据):
+----+------+------+------+------+------+------+
| id | id | a | b | id | b | c |
+----+------+------+------+------+------+------+
| 1 | 1 | 42 | 42 | NULL | NULL | NULL |
| 2 | NULL | NULL | NULL | 2 | 43 | 43 |
+----+------+------+------+------+------+------+
2 rows in set (0.00 sec)
我使用mysqli_result :: fetch_object(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个对象,但是有些列是null:
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)
我可以理解为什么会发生这种情况(某些列具有相同的名称),但我宁愿只使用非空值!就我而言,我有更多的表和更多的列。我不能在列上使用别名,因为我" m"盲目"在我的PHP代码中:我想使用b
而不是b
的别名。
所以我想"更喜欢"该查询中的非空值(没有其他订单规则)。
答案 0 :(得分:2)
指定字段,并使用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都不为空,那么你只得到t2中的一个。 Ans如果两者都为null,则结果仍然为null。
PS:MySQL也有IFNULL
功能。但是IFNULL只接受两个值,并且它对其他数据库的可移植性较差,所以我更喜欢自己合并。
答案 1 :(得分:0)
请改用->fetch(PDO::FETCH_NUM)
。这将获取一个带编号的数组而不是字符串键,因此您不会让您的“重复”字段名称相互覆盖。您将在查询结果中的每个字段中获得一个数组条目。但是你必须非常小心地将这些数组条目映射回查询,因为$row[7]
正是查询中的哪个字段?没办法真正确定。
更好的选择是在查询中对字段进行别名,因此它们具有唯一的名称:
SELECT t1.a AS t1a, t2.2 AS t2a, etc...