mysql - 从左连接获取一行

标签 mysql

标题可能不好,但我找不到更好的简短描述。

这些是我正在使用的表格:

Table Objects:

ID
NAME

Table Geo:

ID
NAME
PARENT_ID (int)
IDENTIFIER (varchar)

Table ObjectsGeo:

ID
OBJECT_ID
GEO_ID

所以我在“对象”中插入一些数据:

insert into objects values(1,'Jack');   
insert into objects values(2,'Penny');  

然后在“geo”中:

insert into geo values(1,'USA', null, '001');   
insert into geo values(2,'New York', 1, '1001');    
insert into geo values(3,'England', null, '002');   
insert into geo values(4,'London', 3, '1002');  

如果 Jack 住在纽约,那么我会这样插入:

insert into ObjectsGeo values(1,1,1);   
insert into ObjectsGeo values(2,1,2);   

如果你告诉我这是一个糟糕的数据库设计,我会同意(其他人编码了这个)。然而,这就是我现在所拥有的,对设计进行更改可能会很复杂/在其他地方导致错误。

现在,当我需要从数据库中获取 Jack 时,因为我也想知道他住在哪里,所以我做了一些非常丑陋的事情,即使用左连接来包含“ObjectsGeo”。然后,我只取第一行(叹气)并使用编程代码“手动”将城市和国家放入对象中。 有没有一种方法,只需一个查询,即可获取 Jack 的行,包括 2 个字段,一个用于国家/地区,一个用于城市?

----编辑---- 这些表或多或少是伪代码。查询本身(也作为伪代码)应该是:

select o.*, g.identifier from objects o left join ObjectsGeo og on og.object_id = o.id left join Geo g on g.id = og.geo_id where o.id = 1;

最佳答案

以下查询将完成工作:

select o.name, 
       (select name from geo where id = min(og.geo_id)) as geo_country, 
       (select name from geo where id = max(og.geo_id)) as geo_city
from objects o
inner join objectsgeo og
on og.object_id = o.id
inner join geo g
on g.id = og.geo_id
group by og.object_id;

Click here for Demo

如果您有任何疑问,请随时在下面发表评论来提问。

希望对你有帮助!

关于mysql - 从左连接获取一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46956106/

相关文章:

php - [PHP]SQL 表从 session 变量中给出不正确的值

mysql - JOIN 上的 SQL 语法错误

java - 使用Java在MySql数据库中插入汉字

mysql数据库在golang中报错【sql : database is closed】

php - 如何从mysql中获取数据并存储在android中的Sqlite数据库中

MySQL 错误 #1241

c# - .NET - 来自非用户输入的 MySQL 查询参数

php - mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows 等...期望参数 1 是资源

php - 在 Laravel 中使用 request->all 保存所有记录记录

php - 如何从字符串的中间删除撇号