我正在执行以下查询:
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中的错误,还是预期的行为?如果是后者,我该如何解决?
答案 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产品始终为空。
根据查询的目标
,做一些不同的事情可能是更好的做法