在 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 代替 LNG 和 LNG2[ 的更聪明的方法=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
我不太喜欢 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 代替 LNG 和 LNG2[ 的更聪明的方法=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