mySQL NATURAL JOIN显示类似于LEFT OUTER JOIN的结果

时间:2012-11-29 01:30:33

标签: mysql sql database-design join

我有以下mySQL查询:

SELECT * FROM `objects`
natural join `gPeople`
natural join `gVip`
natural join `gTeachers`

返回:

object_id       name            vip_code           subject
----------------------------------------------------------
003             John            9003               Math

这是因为'John'属于People,Vip和Teachers。

我只有两组人,并希望他们显示如下:

object_id       name            vip_code           subject
----------------------------------------------------------
001             Mary                               History
002             Holly           9002               
003             John            9003               Math

我尝试过左外连接,但最终得到了很多objects_id列的副本,由于我使用结果的方式,这是不可取的。

注意:我必须使用*,因为它是我想要做的核心。我需要这些表能够支持添加/删除列,并且查询能够提取它们。

http://sqlfiddle.com/#!2/eefe7/3/0这是我尝试过的SQL小提琴,但我的结果如下:

object_id   object_id   name      object_id   vip_code     object_id   subject
------------------------------------------------------------------------------
001         001         Mary                               001         History
002         002         Holly     002         9002                            
003         003         John      003         9003         003         Math

任何人都知道这样做的方法吗?

1 个答案:

答案 0 :(得分:0)

我能够通过在PHP中编辑结果来解决我的问题。

$sql = "SELECT `o`.`object_id` AS `ID`, `gP`.*, `gV`.*, `gT`.* FROM `objects` `o`
left outer join `gPeople` `gP` ON `o`.`object_id` = `gP`.`object_id`
left outer join `gVip` `gV` ON `o`.`object_id` = `gV`.`object_id`
left outer join `gTeachers` `gT` ON `o`.`object_id` = `gT`.`object_id`";

$result = mysql_query($sql);

while ($row = mysql_fetch_object($result)) {
    $row->object_id = $row->ID;
    unset($row->ID);
}

这导致:

object_id       name            vip_code           subject
----------------------------------------------------------
001             Mary                               History
002             Holly           9002               
003             John            9003               Math

而不是:

object_id       name            vip_code           subject
----------------------------------------------------------
001             Mary                               History
                Holly           9002               
003             John            9003               Math

似乎因为对象002的表gSubject中没有object_id,它会用空值覆盖结果中的object_id。

即。对于第一遍(对象表)上的对象002,它等于002然后在第二遍(gPeople表)上再次用002覆盖,然后在第三遍(gVip表)上再次用002覆盖然后在最后一遍( gTeachers表)它被null覆盖,因为表中没有记录。