gpt4 book ai didi

MySQL 连接与联合

转载 作者:行者123 更新时间:2023-11-29 10:32:53 24 4
gpt4 key购买 nike

我有一个表,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 的消息。

SQLFiddle Example

关于MySQL 连接与联合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47065887/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com