MySQL 连接与联合

标签 mysql sql join union

我有一个表,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/

相关文章:

mysql - 如何索引 100 万行 mySQL 表以进行简单查询

mysql - 如何在mysql中的表中添加Btree或哈希索引?

java - SQLite 查询在 Java 中非常慢

在非 O(N^2) 时间内使用滚动窗口构建 SQL 功能

android - 如何将两个数据库表中的数据合并到一个 listView 中

sql - 动态/条件 SQL 连接?

MYSQL 连接结果集在 IN () 期间在 where 子句中删除结果?

java - jpa persist() 函数在 TABLE_PER_TENANT (multi_schema) Multi-Tenancy 策略中给出错误

mysql - 为什么这个 PHP 循环每行渲染两次?

sql - 向表添加新列的脚本