MySQL Left Join 返回左表中的所有数据?

标签 mysql

我有两张 table 。即使选项不在右表中,我也需要从左表返回一行。

仅作为示例,我设置了两个示例表。以下是创建表和填充示例数据的代码:

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 的这一行,所以即使有是数据,您仍然会得到左侧返回的第一 strip 有 NULL 的记录。

我知道这没有多大意义,但对于我正在从事的项目,如果有相关选项,第一条记录被归类为主/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

不确定这是否可行,但如有任何反馈,我们将不胜感激。提前致谢。

最佳答案

想不出一种优雅的方式来做到这一点(希望其他人能提出建议),但可以使用 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`

关于MySQL Left Join 返回左表中的所有数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23627062/

相关文章:

java - 使用 Maven,子模块如何继承父模块的存储库?

MySQL:如何从两张表中获取数据并将其存储到一张表中

mysql - 从同一个表更新一个表。另一个表中的记录之间的关系

java - 在jsp页面中显示mysql数据库的多行

c# - C# 中的下拉列表

mysql - 获取错误 #1111 - 组函数的使用无效

java - 如何使用 Java 在 MySQL 中插入 BIT 值?

mysql - 如何忽略 MySQL 5.6 的小数秒?

php - 查询不插入,但也不报错

javascript - 如何使用 Php 中的 Foreach 或任何其他方式来实现此目标,将 jquery textBox 中的数据插入到 MySql 数据库中?