我有一个表,message
,其中列 id
(主键),parent_id
( self 的外键),owner_id
(创建者用户 ID)和 message
(实际消息)。
我现在正在尝试检索特定 owner_id
拥有的所有列或者有 parent_id
指向特定owner_id
拥有的另一条记录.
我已经成功地做到了这一点:
select * from message m1
left join message m2 on m1.id = m2.parent_id
where m1.owner_id = 1;
但是,我得到的结果如下( m2
添加在右侧的列):
id parent_id owner_id message id parent_id owner_id message
------------------------------------------------------------------------------------------
1 NULL 1 First message 3 1 2 Third message
1 NULL 1 First message 4 1 2 Fourth message
2 NULL 1 Second message NULL NULL NULL NULL
...当我想要这样的时候(所有唯一匹配列的简单列表,顺序并不重要):
id parent_id owner_id message
------------------------------------------
1 NULL 1 First message
3 1 2 Third message
4 1 2 Fourth message
2 NULL 1 Second message
我意识到我可以用 union
来做到这一点,但我看不出有什么方法可以设计联合查询而不使其效率极低。
遇到这样的问题你会如何解决?
谢谢。
编辑:
这是我正在使用的表格:
create table message (
id int(11) unsigned auto_increment primary key,
parent_id int(11) unsigned default null,
owner_id int(11) unsigned not null,
message varchar(255) default null,
index (parent_id),
foreign key (parent_id) references message(id) on update cascade on delete cascade
) engine=innodb default charset=utf8;
最佳答案
左连接和需求的直译就可以了。
select m.* from message m
left join message p on m.parent_id=p.id
where m.owner_id=1 or p.owner_id=1
order by m.id
上面的 SQL 选择所有者 id 为 1 或父级所有者 id 为 1 的消息。
关于MySQL 连接与联合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47065887/