【问题标题】:MySQL returns empty set when empty table is referenced in the query (even if it's unused)MySQL 在查询中引用空表时返回空集(即使它未使用)
【发布时间】:2011-11-07 10:22:55
【问题描述】:

我正在执行以下查询:

SELECT DISTINCT users.user_id, users.email, users.irc_nickname FROM users, user_group_map, user_locale_map WHERE (1=1) GROUP BY users.user_id ORDER BY users.email;

这个查询是由几部分连接起来的,因此有点不理想(它引用了三个表,但只从一个表中选择),但这不应该是问题。问题是当user_locale_map 表恰好为空时,MySQL 会为结果返回一个空集。但是只要我在该表中添加至少一行,例如:

INSERT INTO user_group_map values(2,1);

,我开始得到预期的结果。

谁能告诉我发生了什么以及为什么?这是 MySQL 中的错误,还是预期的行为?如果是后者,我该如何解决?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    select 语句对表进行笛卡尔积。
    然后将 WHERE 子句用作过滤器以减小结果集的大小。

    输入中的空表将导致空输出集(甚至在应用 WHERE 子句之前)。

    您要查找的是OUTER JOIN(谷歌搜索)。

    使用 MYSQL 语法的示例(因为这是我最近使用的)。
    http://dev.mysql.com/doc/refman/5.0/en/outer-join-simplification.html

    SELECT DISTINCT users.user_id, users.email, users.irc_nickname
    FROM user_group_map
    RIGHT JOIN users            ON (user_id)
    RIGHT JOIN user_locale_map  ON (user_id)
    WHERE (1=1)
    GROUP BY users.user_id
    ORDER BY users.email;
    

    这里的 user 和 user_locale_map 的成员可能为 NULL

    【讨论】:

    • 谢谢!我认为您在查询中留下了一个小错误,但这对我有所帮助。这是我最终得到的结果:SELECT DISTINCT users.user_id, users.email, users.irc_nickname FROM users LEFT JOIN user_group_map USING (user_id) LEFT JOIN user_locale_map USING (user_id) WHERE (1=1) GROUP BY users.user_id ORDER BY users.email;
    【解决方案2】:

    您正在对“users, user_group_map, user_locale_map”进行交叉连接,因此如果其中一个表为空,则不会返回任何结果,这有点像乘以零......你总是得到零。您可能想研究其他类型的连接,例如“左连接”,即使其他表为空,它也会包含特定表中的所有记录。

    【讨论】:

      【解决方案3】:

      来自多个连接的SELECT 执行表的笛卡尔积。

      任何具有空集的笛卡尔积总是空的。

      根据查询的目标,做一些不同的事情可能会更好

      【讨论】:

        猜你喜欢
        • 2014-06-04
        • 1970-01-01
        • 1970-01-01
        • 2022-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多