我有两张桌子。我需要从左表中返回一行,即使对于不在右表中的选项也是如此。
仅举例来说,我已经设置了两个样本表。这是创建表格和代码的代码。填充样本数据:
CREATE TABLE `names` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
`optionid` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;
/*Data for the table `names` */
insert into `names`(`id`,`name`,`optionid`) values (1,'name1',1),(2,'name2',2),(3,'name3',3),(4,'name4',4);
CREATE TABLE `options` (
`tableid` int(11) NOT NULL AUTO_INCREMENT,
`description` varchar(30) DEFAULT NULL,
`optionid` int(11) DEFAULT NULL,
PRIMARY KEY (`tableid`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=latin1;
/*Data for the table `options` */
insert into `options`(`tableid`,`description`,`optionid`) values (1,'option1',1),(2,'option2',1),(3,'option3',1),(4,'option1',2),(5,'option2',2),(6,'option1',3),(7,'option',3);
好的,所以我可以离开连接,它将返回左边的所有行,并在右侧放置NULL,以获取几乎没有在右表中的任何数据。
现在,如果右表中存在匹配值,则只返回右表中包含数据的值。现在我需要返回我将作为主记录分类的内容,然后返回右边的所有选项。
所以,如果我跑:
SELECT
`names`.`id`
, `names`.`name`
, `names`.`optionid`
, `options`.`description`
, `options`.`optionid`
FROM
`test`.`names`
LEFT JOIN `test`.`options`
ON (`names`.`optionid` = `options`.`optionid`);
返回:
id name optionid description optionid
1 name1 1 option1 1
1 name1 1 option2 1
1 name1 1 option3 1
2 name2 2 option1 2
2 name2 2 option2 2
3 name3 3 option1 3
3 name3 3 option 3
4 name4 4 NULL NULL
这正是我所期望的,但不是我想要的。
最后一行,ID 4返回带有空值的数据,因为右表中没有数据现在我需要返回此行的ID 1,2和& 3即使右表中有数据,所以即使有数据,你仍然可以从左边获得第一条带有NULL的记录。
我知道这并没有多大意义但是对于我正在研究的项目,如果有相关的选项,第一条记录被归类为Master / Shell记录,而且选项在PHP中循环但是对于API,我需要在SQL中处理这个问题,这意味着返回额外的Shell记录。
所以我希望得到的结果是:
id name optionid description optionid
1 name1 1 NULL NULL
1 name1 1 option1 1
1 name1 1 option2 1
1 name1 1 option3 1
2 name1 1 NULL NULL
2 name2 2 option1 2
2 name2 2 option2 2
3 name1 1 NULL NULL
3 name3 3 option1 3
3 name3 3 option 3
4 name4 4 NULL NULL
不确定这是否可能,但我们将不胜感激。提前谢谢。
答案 0 :(得分:0)
不能想到这样做的优雅方式(希望其他人会提出建议),但可以使用UNION来实现: -
SELECT `names`.`id`, `names`.`name`, `names`.`optionid`, `options`.`description`, `options`.`optionid`
FROM `test`.`names`
LEFT JOIN `test`.`options`
ON (`names`.`optionid` = `options`.`optionid`)
UNION
SELECT `names`.`id`, `names`.`name`, `names`.`optionid`, NULL, NULL
FROM `test`.`names`