这是我的表结构:
// 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
但它只返回第一行。怎么了?
答案 0 :(得分:2)
你可以这样做:
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)
上定义两个索引。
答案 1 :(得分:2)
如果我理解正确你正在寻找这个:
select m1.*
from mytable m1 where m1.id = 1 or m1.related = 1
答案 2 :(得分:1)
您需要使用内连接。
select m1.*
from mytable m1
inner join mytable m2 on m1.id = m2.related
where m1.id = 1
答案 3 :(得分:1)
您可以尝试使用UNION ALL,或者如果您不想要重复使用UNION
select * from mytable m1 where m1.id = 1
UNION
select * from mytable m2 where m2.related = 1
答案 4 :(得分:1)