【问题标题】:How can I select a row plus all its related rows?如何选择一行及其所有相关行?
【发布时间】:2018-04-18 15:14:27
【问题描述】:

这是我的表结构:

// mytable
+----+---------+
| id | related |
+----+---------+
| 1  | NULL    |
| 2  | 1       |
+----+---------+

现在我需要选择具有id = 1 的行和所有具有related = 1 的行。这是我的查询:

select m1.*
from mytable m1
left join mytable m2 on m1.id = m2.related
where m1.id = 1

但它只返回第一行。怎么了?

【问题讨论】:

  • 连接用于连接两个表。如果您真的想使用连接,我认为您需要内部连接。
  • 你能在你的问题部分添加预期的输出吗?

标签: mysql sql


【解决方案1】:

你可以这样做:

select t.*
from mytable t
where 1 in (id, related);

不需要自加入。

编辑:

如果您想要性能,则将查询编写为:

select t.*
from mytable t
where id = 1
union all
select t.*
from mytable t
where related = 1;

并在mytable(id)mytable(related)上定义两个索引。

【讨论】:

  • 需要什么样的索引? mytable(id, related) ?
  • @MartinAJ 。 . . or 不能很好地优化索引。查看我的编辑。
【解决方案2】:

如果我理解正确,您正在寻找这个:

select m1.*
from mytable m1 where m1.id = 1 or m1.related = 1

【讨论】:

    【解决方案3】:

    你需要使用内连接。

    select m1.*
    from mytable m1
    inner join mytable m2 on m1.id = m2.related
    where m1.id = 1
    

    【讨论】:

      【解决方案4】:

      你能试试这个代码吗

      SELECT * FROM table WHERE (id = 1 AND related IS NULL) OR related = 1;

      我创建了一个包含更多项目的表格,它会返回您想要的内容。看看这个

      【讨论】:

        【解决方案5】:

        你可以试试 UNION ALL 或者如果你不想重复使用 UNION

        select * from mytable m1 where m1.id = 1
        UNION
        select * from mytable m2 where m2.related = 1
        

        【讨论】:

        • 您可以尝试union all,或者如果您还必须删除重复项,请使用unionunion 删除重复项,而不是 union all
        猜你喜欢
        • 2017-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-21
        • 2017-08-29
        • 2021-12-14
        • 2016-06-15
        相关资源
        最近更新 更多