我在 JOIN 主表“cities”和 lang 表“cities_lang”时遇到问题
我使用这种方式,但 UNION 忽略我的索引。
EXPLAIN
SELECT *
FROM `cities` `t`
LEFT OUTER JOIN (
SELECT *
FROM (
SELECT * FROM `cities_lang` `AIlang` WHERE lang = "ru"
UNION
SELECT * FROM `cities_lang` `AIlang` WHERE lang = "en"
UNION
SELECT * FROM `cities_lang` `AIlang` WHERE lang != "ru" AND lang != "en"
) AS one
GROUP BY one.city__id
) AS AIlang ON (`AIlang`.`city__id`=`t`.`id`)
WHERE (sort_no IS NOT NULL AND type = 1)
ORDER BY sort_no
你能为我提供一些方法,以我需要的排序语言从 lang 表中获取行
最佳答案
您可以只加入 cities_lang
表一次并将您的条件包含在 ON
中,而不是使用多个 UNION
:
SELECT *
FROM `cities` `t`
LEFT OUTER JOIN `cities_lang` AS AIlang ON (`AIlang`.`city__id`=`t`.`id`)
AND (
lang IN("ru","en") OR
(lang != "ru" AND lang != "en")
)
WHERE (sort_no IS NOT NULL AND type = 1)
ORDER BY sort_no
我不知道这是否能解决您有关索引访问的问题,因为现在这是一个复杂的 JOIN
条件,但运行 EXPLAIN
并看看它说了什么。
就像前面提到的评论者一样,您的 SQL
对于 GROUP BY
和 SELECT *
来说有点笨拙。您可能希望通过仅选择要投影的列来收紧它。
关于mysql - 使用 UNION JOIN lang 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58112417/