在超过5个表上进行SQL左联接

时间:2018-08-13 16:06:57

标签: mysql sql

该代码正在撤退我想要检索的内容,尽管它的执行量是我需要的四倍。

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

enter image description here

理想的结果是它将仅返回 2行,并带有相应的标题,简短描述和详细描述。目前是返回8行

我注意到的问题是它以一种奇怪的方式对列进行排序。 如果您仔细观察,会发现 title titleLangCode titleLangCode 之后正确排序,而长短说明则由它们自己的< strong> langCode 。对它们进行分组不会起作用,因为它们的顺序不同,因此对它们进行排序没有任何效果,因为列号,联合也不起作用,甚至尝试了不同但无济于事。

代码:

               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

是否有可能以某种方式将限制与组合并?我尝试过但没有成功。

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

1 个答案:

答案 0 :(得分:2)

如果我正确理解这一点,则问题在于您有多个转换表,这些转换表与该属性具有一对多的关系。因此,在第一次加入后,您将拥有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

我对此做了一些简化,并为表名使用别名来缩短连接条件。

编辑:我想说这也是数据库设计不良的标志。您可能应该先引入一个表“语言”,然后再引入一个映射表属性-翻译映射。不知道这是否在您的控制之下,但是使用这样的表进行设置会更好。

  • 属性:属性的所有详细信息。
  • 语言:带有ID的所有语言的列表。
  • FieldId:您在数据库中拥有的命名列的列表。
  • 翻译:属性,语言和字段的组合,然后您可以在该字段上进行单个翻译。