Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何基于相关列进行自联接?_Mysql_Sql_Join - Fatal编程技术网

Mysql 如何基于相关列进行自联接?

Mysql 如何基于相关列进行自联接?,mysql,sql,join,Mysql,Sql,Join,我有这张桌子: // mytable +----+---------+---------+ | id | related | color | +----+---------+---------+ | 1 | NULL | red | | 2 | 1 | blue | | 3 | NULL | green | | 4 | 1 | white | | 5 | 3 | brown | | 6 | NULL

我有这张桌子:

// mytable
+----+---------+---------+
| id | related |  color  |
+----+---------+---------+
| 1  | NULL    | red     |
| 2  | 1       | blue    |
| 3  | NULL    | green   |
| 4  | 1       | white   |
| 5  | 3       | brown   |
| 6  | NULL    | gray    |
| 7  | 3       | black   |
| 8  | 1       | orange  |
| 9  | 6       | pink    |
+----+---------+---------+
我有一个
id
号码,我需要得到相关
id
的颜色

以下是一些例子:

$id = 4; // I need to get `red`
$id = 5; // I need to get `green`
$id = 6; // I need to get `gray`
$id = 9; // I need to get `gray`
我的问题是:

SELECT t2.color FROM mytable t1 JOIN mytable t2 ON t1.related = t2.id WHERE t1.id = :id

它几乎适用于所有行,并返回预期的颜色。只是它不适用于那些具有
NULL
related的行。如何解决此问题?

您可以使用
左连接
将相关颜色与相关列中的id相关联。在没有相关颜色的情况下,
COALESCE()
将返回原色

SELECT t.id, COALESCE(r.color,t.color) AS color
FROM myTable t
LEFT OUTER JOIN myTable r ON r.id = t.related
WHERE t.id = :id

下面是用于比较的
内部联接
查询。您将看到丢失了相关id为
NULL
的行,我认为这不是您想要的

SELECT t.id, COALESCE(r.color,t.color) AS color
FROM myTable t
INNER JOIN myTable r ON r.id = t.related
WHERE t.id = :id

您可以使用
左连接
将相关颜色与相关列中的id相关联。在没有相关颜色的情况下,
COALESCE()
将返回原色

SELECT t.id, COALESCE(r.color,t.color) AS color
FROM myTable t
LEFT OUTER JOIN myTable r ON r.id = t.related
WHERE t.id = :id

下面是用于比较的
内部联接
查询。您将看到丢失了相关id为
NULL
的行,我认为这不是您想要的

SELECT t.id, COALESCE(r.color,t.color) AS color
FROM myTable t
INNER JOIN myTable r ON r.id = t.related
WHERE t.id = :id
请查看演示


查看演示。

啊,我理解
ISNULL()
。但是为什么
左外连接
JOIN
有什么问题吗?您的查询也没有What
WHERE
子句。。!为什么?左连接的语法不需要where子句,除非指定特定的子集。这将获取所有行。它如何不工作。左外的原因是id和related之间不存在相等连接。您需要
COALESCE
而不是
ISNULL
。或者
IFNULL
Ah,我理解
ISNULL()。但是为什么
左外连接
JOIN
有什么问题吗?您的查询也没有What
WHERE
子句。。!为什么?左连接的语法不需要where子句,除非指定特定的子集。这将获取所有行。它如何不工作。左外的原因是id和related之间不存在相等连接。您需要
COALESCE
而不是
ISNULL
。或者
IFNULL
谢谢。。向上投票,到底什么是
外部
?为什么不仅仅是
LEFT JOIN
?@stack在mysql的情况下,我认为没有区别,IIRC是ANSI-SQL标准约定,但您可以省略它。一个简单的左连接就可以了。最常见的联接是“内部”联接,您希望记录在给定键的情况下相交,因此可以将外部联接视为相反的联接。现在,您仍然希望所有记录都从左边开始,所以您基本上是这样说的“取左边的所有内容,并尝试将其与右边匹配,如果某个记录不一致,请将外部记录保留为空,但仍返回左边的记录。谢谢。。向上投票,到底什么是
外部
?为什么不仅仅是
LEFT JOIN
?@stack在mysql的情况下,我认为没有区别,IIRC是ANSI-SQL标准约定,但您可以省略它。一个简单的左连接就可以了。最常见的联接是“内部”联接,您希望记录在给定键的情况下相交,因此可以将外部联接视为相反的联接。现在,不管怎样,您仍然希望所有记录都从左边开始,因此您基本上是说“将左边的所有记录都取下来,并尝试将其与右边匹配,如果某个记录没有重合,请将外部记录保留为null,但仍然返回左边的记录。