首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MySQL:在具有相同列的表上左联接

MySQL:在具有相同列的表上左联接
EN

Stack Overflow用户
提问于 2014-07-21 15:04:48
回答 2查看 150关注 0票数 0

下面是3个MySQL表:

代码语言:javascript
运行
复制
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`)
);

我想从这个表格中获取所有数据:

代码语言:javascript
运行
复制
select * from t1
left join t2 on t1.id=t2.id
left join t3 on t1.id=t3.id;

结果是(表中有一些随机数据):

代码语言:javascript
运行
复制
+----+------+------+------+------+------+------+
| 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)检索和处理数据:

代码语言:javascript
运行
复制
$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());

所以我有两个对象,但是有些列是空的:

代码语言:javascript
运行
复制
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的别名。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-21 15:08:03

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

代码语言:javascript
运行
复制
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中得到一个,如果两者都是空的,结果仍然是空的。

PS: MySQL也有IFNULL函数。但是IFNULL只接受两个值,而且它对其他数据库的可移植性较低,因此我更喜欢自己合并。

票数 2
EN

Stack Overflow用户

发布于 2014-07-21 15:10:06

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

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

代码语言:javascript
运行
复制
SELECT t1.a AS t1a, t2.2 AS t2a, etc...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24868442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档