【问题标题】:SQL OUTER JOIN with empty fields (null) where no resultSQL OUTER JOIN 与空字段 (null) 没有结果
【发布时间】:2015-03-08 12:16:19
【问题描述】:

你好!

好的,我的情况是这样的:我有一个数据库,我需要从 4 个不同的表中进行 SELECT 并获得一个表中的外键与其他 3 个表中的 id 匹配的结果。

结构:

CREATE TABLE IF NOT EXISTS `languages` (
  `id` int(11) NOT NULL,
  `lang_name` varchar(64) COLLATE utf8_bin NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

CREATE TABLE IF NOT EXISTS `main_keys` (
  `id` int(11) NOT NULL,
  `project` int(11) NOT NULL,
  `key` text COLLATE utf8_bin NOT NULL,
  `comment` varchar(128) COLLATE utf8_bin NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

CREATE TABLE IF NOT EXISTS `projects` (
  `id` int(11) NOT NULL,
  `project_name` varchar(64) COLLATE utf8_bin NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

CREATE TABLE IF NOT EXISTS `translations` (
  `id` int(11) NOT NULL,
  `project` int(11) NOT NULL,
  `key` int(11) NOT NULL,
  `language` int(11) NOT NULL,
  `translation` text COLLATE utf8_bin NOT NULL,
  `lastedit` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

translations 表是包含所有关系的表(translations.project => project.idtranslations.key => main_keys.idtranslations.language => language.id)。

Relational overview http://assets.brianemilius.com/locale_relations.png

我当前的查询如下所示

SELECT t.id, mk.key, t.translation, mk.comment, p.project_name, t.lastedit
    FROM translations t
    INNER JOIN languages l ON l.id = t.language
    INNER JOIN main_keys mk ON mk.id = t.key
    INNER JOIN projects p ON p.id = mk.project
    WHERE p.id = '1' AND l.id = '2'

我正在从特定项目 (p.id) 和特定语言 (l.id) 中进行选择,我想要一个结果,显示如下:

+----+--------------+-------------+---------------------------+-----------------------+---------------------+
| id | key          | translation | comment                   | project_name          | lastedit            |
+----+--------------+-------------+---------------------------+-----------------------+---------------------+
| 2  | Hello World! | Hej verden! | Test key for dev purposes | Locale Administrator  | 2015-02-24 12:37:28 |
+----+--------------+-------------+---------------------------+-----------------------+---------------------+
|    | test key     |             | Test key for dev purposes | Locale Administrator  |                     |
+----+--------------+-------------+---------------------------+-----------------------+---------------------+
|    | test key 2   |             | Test key for dev purposes | Locale Administrator  |                     |
+----+--------------+-------------+---------------------------+-----------------------+---------------------+

第 2 行和第 3 行表示没有翻译的结果。

但我只得到 1 行结果 - id 为 2 的前一个结果(因为表中目前只有一个翻译行 translations)。

我在查询中尝试了 LEFT 和 RIGHT JOIN 的各种组合,但似乎没有任何帮助。我是步入正轨还是需要彻底重新思考?

【问题讨论】:

    标签: mysql outer-join


    【解决方案1】:

    我认为您需要重新考虑一下并使用main_keys 表作为主要来源并左连接其他表:

    SELECT t.id, mk.key, t.translation, mk.comment, p.project_name, t.lastedit
    FROM main_keys mk
    LEFT JOIN translations t ON mk.id = t.key
    LEFT JOIN languages l ON l.id = t.language  
    LEFT JOIN projects p ON p.id = mk.project 
    WHERE p.id = 1 AND l.id = 2 OR l.id IS null;
    

    【讨论】:

      猜你喜欢
      • 2018-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-24
      • 1970-01-01
      • 2010-09-29
      • 1970-01-01
      相关资源
      最近更新 更多