该代码正在撤回我希望它检索的内容,尽管它执行的操作是我需要的 4 倍。
我有一个名为 property 的表,其中包含 PK property_ID。属性具有标题、简短描述、详细描述,并且它属于一个兴趣点,其中转弯连接到一个城市。标题、短描述和长描述都有独立的链接表,其中属性和翻译表中相应的翻译之间创建链接。 我使用左连接来收集所有所需的信息,您可以在下面的图像附件中看到结果。
期望的结果是它仅返回 2 行,以及相应的标题翻译、短描述和长描述。目前返回 8 行。
我注意到的问题是它以一种奇怪的方式对列进行排序。 如果仔细观察,您会发现 title 和 titleLangCode 在 titleLangCode 之后正确排序,而长描述和短描述则按其自己的 < 排序。强>语言代码强>。对它们进行分组不起作用,因为它们的顺序不同,因此对它们进行排序没有效果,由于列号的原因,联合也不起作用,甚至尝试了不同但无济于事。
代码:
select
property.*,
title_translation.title,
title_translation.langCode as titleLangCode,
short_desc_translation.shortDescription,
long_desc_translation.longDescription,
short_desc_translation.langCode as shortLangCode,
long_desc_translation.langCode as longLangCode,
property_city_poi.city_poi_link_ID
from
property
left join
title_link
on
property.property_ID = title_link.property_ID
left join
title_translation
on
title_link.title_link_ID = title_translation.title_link_ID
left join
short_desc_link
on
property.property_ID = short_desc_link.property_ID
left join
short_desc_translation
on
short_desc_link.short_desc_link_ID = short_desc_translation.short_desc_link_ID
left join
long_desc_link
on
property.property_ID = long_desc_link.property_ID
left join
long_desc_translation
on
long_desc_link.long_desc_link_ID = long_desc_translation.long_desc_link_ID
left join
property_city_poi
on
property.property_ID = property_city_poi.property_ID
where
property.property_ID = 10
是否有可能以某种方式将 limit 与 group 结合起来?我尝试过,但没有成功。
title_link
title_link_ID
property_ID
dateCreated
title_translation
title_translation_ID
title_link_ID
langCode
title
short_desc_link
short_desc_link_ID
property_ID
dateCreated
short_desc_translation
short_desc_translation_ID
short_desc_link_ID
langCode
shortDescription
long_desc_link
long_desc_link_ID
property_ID
dateCreated
long_desc_translation
long_desc_translation_ID
long_desc_link_ID
langCode
shortDescription
最佳答案
如果我理解正确,问题是您有多个与属性具有一对多关系的转换表。因此,在第一次连接之后,您将得到 2 行,然后是 4 行,然后是 8 行,其中包含所有语言的组合。
您可以通过加入 2 个条件来限制这一点。
... property p
INNER JOIN titel_link tl on p.id = tl.propertyid
INNER JOIN short_desk_link sdl on p.id = tl.propertyid AND tl.langCode = sdl.langCode
我对此进行了一些简化,并使用表名的别名来缩短连接条件。
编辑:我想说这也是糟糕的数据库设计的标志。您可能应该引入一个表“语言”,然后引入一个映射表属性-翻译映射。不确定这是否在您的控制之下,但使用这样的表格进行设置会更好。
- 属性(property):属性(property)的所有详细信息。
- 语言:带有 Id 的所有语言的列表。
- FieldId:数据库中的命名列的列表。
- 翻译:属性、语言和字段的组合,您可以在其中对该字段进行单一翻译。
关于mysql - 超过 5 个表的 SQL 左连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51826482/