mysql - 在 MySql 中将表连接回自身

标签 mysql sql data-modeling

假设我有三个表:

用户表:

CREATE TABLE `user` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  `loc` int(11) DEFAULT NULL,
  `doc` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;

位置表:

CREATE TABLE `location` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;

文档表:

CREATE TABLE `document` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `maintainer` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;

我可以通过以下查询成功提取用户信息及其对应的locationdocument 信息:

SELECT * from `user` LEFT JOIN `location` on user.loc = location.id LEFT JOIN `document` on user.doc = document.id;

location 信息很容易被引用,因为它的信息不引用任何其他表中的任何其他行。然而,document 表包含一个 maintainer 字段,它直接对应于 user 表中的另一个 user。该字段封装了user信息,并没有给我实际的user数据。

是否没有一种查询表的方法,使 maintainer 的数据返回实际的 user 数据而不是 id

最佳答案

select
    u.name as user_name,
    m.name as maintainer_name,
    l.name as location_name
from user as u
    left outer join document as d on d.id = u.doc
    left outer join user as m on m.id = d.maintainer
    left outer join location as l on l.id = u.loc

关于mysql - 在 MySql 中将表连接回自身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18153671/

相关文章:

mySQL 查询获取不匹配的记录

mysql - 将数据插入mysql字段为空

sql - Postgres : Optimizing querying by datetime

mysql - 将一行的列与另一行的同一列进行比较,如果匹配则更新第三列

具有 1 个主键、1 个集群列和 1 个常规列的 Cassandra 表不会追加数据。它会覆盖它

mysql - 与 MyIsam 相比,InnoDB 行大小较大

php - 为什么 MySQL ZIP 存档中没有 my-default.ini?

sql - 需要将 LIMIT 更改为其他内容

database - 在 ERD 中绘制多对多关系

mongodb - 您将如何在 MongoDB 中为电子邮件应用程序建模?