当查询中引用空表时,MySQL返回空集(即使它未使用)

时间:2011-11-07 10:22:55

标签: mysql

我正在执行以下查询:

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中的错误,还是预期的行为?如果是后者,我该如何解决?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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

答案 2 :(得分:1)

来自多个联接的SELECT执行表格的Cartessian产品。

任何具有空集的集合的Cartessian产品始终为空。

根据查询的目标

,做一些不同的事情可能是更好的做法