【问题标题】:How can I do a self-join based on a related column?如何根据相关列进行自加入?
【发布时间】:2016-09-23 17:35:30
【问题描述】:

我有这张桌子:

// 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 相关的那些行。我该如何解决这个问题?

【问题讨论】:

    标签: mysql sql join


    【解决方案1】:
    SELECT c1.id as id,
      IFNULL(c2.color, c1.color) as color
    FROM colors c1 
    LEFT OUTER JOIN colors c2
      ON c1.related = c2.id;
    

    通过演示检查this sqlfiddle

    【讨论】:

    • 谢谢 .. 点赞,OUTER 是什么?为什么不只是LEFT JOIN
    • @stack 在 mysql 的情况下,我认为没有区别,IIRC 它是 ANSI-SQL 标准约定,但您可以省略它。一个简单的左连接就可以了。最常见的联接是“INNER”联接,您希望记录在给定键的情况下相交,因此将 OUTER 视为与之相反的。现在,无论如何,您仍然需要左侧的所有记录,因此您基本上是在说“将左侧的所有内容并尝试将其与右侧匹配,如果记录没有巧合,则将 OUTER 记录保留为空,但仍返回左。
    【解决方案2】:

    您可以使用LEFT JOIN 将相关颜色与相关列中的 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
    

    这是用于比较的INNER JOIN 查询。你会看到你丢失了相关 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()。但是为什么LEFT OUTER JOINJOIN 怎么了?
    • 您的查询也不是WHERE 子句..!为什么?
    • 左连接的语法不需要 where 子句,除非你指定了一个特定的子集。这将获取所有行。
    • 怎么不行。而左外的原因是id和related之间的等值连接不存在。
    • 您需要COALESCE 而不是ISNULL。或IFNULL
    猜你喜欢
    • 2022-10-02
    • 2014-02-05
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 2015-12-29
    • 2023-03-23
    相关资源
    最近更新 更多