标题可能不好,但我找不到更好的简短描述。
这些是我正在使用的表格:
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;
如果您有任何疑问,请随时在下面发表评论来提问。
希望对你有帮助!
关于mysql - 从左连接获取一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46956106/