sql - 在单个查询中从他们的 ID 获取相关数据的最佳方法是什么?

标签 sql mysql join relational

我有一个表,其中每一行都有一些字段,这些字段具有与其他表中的一些其他数据相关的 ID。

假设它叫做people,每个人都有一个citystatecountry的ID .

所以会有另外三个表,citiesstatescountries,每个表都有一个 ID 和一个名称。

当我选择一个人时,获取城市国家的姓名的最简单方法是什么 在单个查询中?

注意:我知道这可以通过联接实现,但是由于有更多相关表,嵌套联接使查询难以阅读,我想知道是否有更简洁的方法。此人也应该可以将这些字段留空。

最佳答案

假设下表:

create table People
(
     ID        int          not null primary key auto_increment
    ,FullName  varchar(255) not null
    ,StateID   int 
    ,CountryID int 
    ,CityID    int 
)
;
create table States
(
     ID   int          not null primary key auto_increment
    ,Name varchar(255) not null
)
;
create table Countries
(
     ID   int          not null primary key auto_increment
    ,Name varchar(255) not null
)
;
create table Cities
(
     ID   int          not null primary key auto_increment
    ,Name varchar(255) not null
)
;

具有以下数据:

insert into Cities(Name) values ('City 1'),('City 2'),('City 3');
insert into States(Name) values ('State 1'),('State 2'),('State 3');
insert into Countries(Name) values ('Country 1'),('Country 2'),('Country 3');
insert into People(FullName,CityID,StateID,CountryID) values ('Has Nothing'   ,null,null,null);
insert into People(FullName,CityID,StateID,CountryID) values ('Has City'      ,   1,null,null);
insert into People(FullName,CityID,StateID,CountryID) values ('Has State'     ,null,   2,null);
insert into People(FullName,CityID,StateID,CountryID) values ('Has Country'   ,null,null,   3);
insert into People(FullName,CityID,StateID,CountryID) values ('Has Everything',   3,   2,   1);

那么这个查询应该给你你想要的东西。

select 
 P.ID
,P.FullName
,Ci.Name as CityName
,St.Name as StateName
,Co.Name as CountryName
from People P
left Join Cities    Ci on Ci.ID = P.CityID
left Join States    St on St.ID = P.StateID
left Join Countries Co on Co.ID = P.CountryID

关于sql - 在单个查询中从他们的 ID 获取相关数据的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/394771/

相关文章:

mysql - 嵌套选择 选择

firebase - Flutter Firestore 理解加入

java - 如何让 JOOQ 同时生成枚举类型和自定义类型?

sql - 如何在连接中使用三个不同的列来仅获取 PostgreSQL 中的两列?

java - Room Java - 是否可以在界面中运行事务?

mysql - "MYISAM"数据库存储引擎和 "ISAM"索引之间的差异

mysql - 使用 INNER JOIN 重写 UPDATE 查询而不使用 IN

java - 获取使用 Hibernate 映射的属性的列名

c# - 如何从我的 SQL CLR 项目中引用非 SQL CLR 项目?

MySQL 数组/项目列表和性能