在 JOIN 2 次相同的 table 的查询中使用单个 table 实例的更聪明的方法是什么?

What is a smarter way to use a single table instance in a query that JOIN 2 times the same table?

我不太喜欢 SQL 并且我在处理一个查询时遇到以下问题,该查询执行一些 JOIN 并且必须加入 2 次相同的 Languages table.

我正在使用 MySql。我会尽力解释我的问题。

所以我有这个查询:

SELECT 
        LSSN.livestock_species_name AS species_name,
        LSM.content                 AS message_content,
        LSM.audio_link              AS message_audio_link
FROM LivestockDetails AS LSD
INNER JOIN LsMessage AS LSM
      ON LSD.ls_message_id = LSM.id 
INNER JOIN Languages AS LNG
      ON LSM.language_id = LNG.id
INNER JOIN LivestockSpecies AS LSS
      ON LSD.live_stock_species_id = LSS.id
INNER JOIN LivestockSpeciesName AS LSSN
      ON LSS.id = LSSN.livestock_species_id 
INNER JOIN LNG
      ON LSSN.language_id = LNG.id
WHERE LSD.live_stock_species_id = 3
AND LSD.ls_area_id = 2
AND LSD.ls_action_type_id = 1
AND LSD.ls_message_id is not null
AND LNG.id = 1

如您所见,我正在尝试加入 2 次 Langunages(别名是 LNG)。

曾经在这里(因为我有特定语言的本地化消息):

INNER JOIN LsMessage AS LSM
      ON LSD.ls_message_id = LSM.id 

这里还有一个(因为LSSN table包含特定语言的动物名称):

INNER JOIN LNG
      ON LSSN.language_id = LNG.id

这样做是行不通的,我收到此错误消息:

#42000Not unique table/alias: 'LNG'

我想是因为我参加了两次相同的活动table。

我可以这样做,而且效果很好:

SELECT 
        LSSN.livestock_species_name AS species_name,
        LSM.content                 AS message_content,
        LSM.audio_link              AS message_audio_link
FROM LivestockDetails AS LSD
INNER JOIN LsMessage AS LSM
      ON LSD.ls_message_id = LSM.id 
INNER JOIN Languages AS LNG
      ON LSM.language_id = LNG.id
INNER JOIN LivestockSpecies AS LSS
      ON LSD.live_stock_species_id = LSS.id
INNER JOIN LivestockSpeciesName AS LSSN
      ON LSS.id = LSSN.livestock_species_id 
INNER JOIN Languages AS LNG2
      ON LSSN.language_id = LNG2.id
WHERE LSD.live_stock_species_id = 3
AND LSD.ls_area_id = 2
AND LSD.ls_action_type_id = 1
AND LSD.ls_message_id is not null
AND LNG.id = LNG2.id = 1

我加入了 "brand new" INNER JOIN Languages AS LNG2 table 但是我必须更改 WHERE 这样的子句:

AND LNG.id = LNG2.id = 1

我想问这是否是一个好的解决方案,或者是否存在使用单个 table 代替 LNGLNG2[ 的更聪明的方法=49=] tables 在 JOIN 操作中。

这是您实现目标的另一种方式:

INNER JOIN Languages AS LNG
    ON LSM.language_id = LNG.id
INNER JOIN Languages AS LNG2
    ON LSM.language_id = LNG2.id AND LSSN.language_id = LNG2.id

我认为你不能将这 2 个连接合并为 1 个连接。

完整查询:

SELECT 
        LSSN.livestock_species_name AS species_name,
        LSM.content                 AS message_content,
        LSM.audio_link              AS message_audio_link
FROM LivestockDetails AS LSD
INNER JOIN LsMessage AS LSM
      ON LSD.ls_message_id = LSM.id 
INNER JOIN Languages AS LNG
      ON LSM.language_id = LNG.id
INNER JOIN LivestockSpecies AS LSS
      ON LSD.live_stock_species_id = LSS.id
INNER JOIN LivestockSpeciesName AS LSSN
      ON LSS.id = LSSN.livestock_species_id 
INNER JOIN Languages AS LNG2
    ON LSM.language_id = LNG2.id AND LSSN.language_id = LNG2.id
WHERE LSD.live_stock_species_id = 3
AND LSD.ls_area_id = 2
AND LSD.ls_action_type_id = 1
AND LSD.ls_message_id is not null
AND LNG.id = 1