mysql - 超过 5 个表的 SQL 左连接

标签 mysql sql

该代码正在撤回我希望它检索的内容,尽管它执行的操作是我需要的 4 倍。

我有一个名为 property 的表,其中包含 PK property_ID。属性具有标题简短描述详细描述,并且它属于一个兴趣点,其中转弯连接到一个城市。标题、短描述和长描述都有独立的链接表,其中属性和翻译表中相应的翻译之间创建链接。 我使用左连接来收集所有所需的信息,您可以在下面的图像附件中看到结果。

enter image description here

期望的结果是它仅返回 2 行,以及相应的标题翻译、短描述和长描述。目前返回 8 行

我注意到的问题是它以一种奇怪的方式对列进行排序。 如果仔细观察,您会发现 titletitleLangCodetitleLangCode 之后正确排序,而长描述和短描述则按其自己的 < 排序。强>语言代码。对它们进行分组不起作用,因为它们的顺序不同,因此对它们进行排序没有效果,由于列号的原因,联合也不起作用,甚至尝试了不同但无济于事。

代码:

               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/

相关文章:

sql - 复杂的SQL查询-嵌套查询

sql - 是否可以避免在 SQL Server CTE 中指定列列表?

java - 如何将 Java 类连接到 GUI?

mysql - 从大表中查询小选择的最快方法?

mysql - SQL - where 子句中的未知列

mysql - 从 "data"文件夹mysql转储数据

php - 为什么这个表格不起作用?

MySql 在 Yii2 中有条件地选择最小值、最大值而没有子选择

mysql - AVG 返回 null 但不应返回 null

php - 是否可以保持 MYSQL session 打开?