mysql - 使用 UNION JOIN lang 表

标签 mysql

我在 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

http://prntscr.com/pb5k27

你能为我提供一些方法,以我需要的排序语言从 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 BYSELECT * 来说有点笨拙。您可能希望通过仅选择要投影的列来收紧它。

关于mysql - 使用 UNION JOIN lang 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58112417/

相关文章:

mysql - 枚举或计数行 JOIN MySql

php - 使用 Markdown 和 MySQL 时正确的操作顺序?

php - 使用数组获取提交表单操作

php - CodeIgniter PDO 数据库驱动程序不工作

MySQL:从自引用(?)SELECT 查询生成的列

php - 无法将我的 PHP 代码连接到数据库 - Android Studio

PHP MySQL 之间的日期

mysql - Ubuntu mysql Dreamweaver 403 错误

php - 如何将 MySQL 数据透视表精确复制(样式和数据)到 HTML?

mysql - 当我确定主键是并且永远是唯一的时,它是否应该自动递增?