Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL在查询中引用空表时返回空集(即使未使用)_Mysql - Fatal编程技术网

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

MySQL在查询中引用空表时返回空集(即使未使用),mysql,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\u locale\u

我正在执行以下查询:

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\u locale\u map表恰好为空时,MySQL会为结果返回一个空集。但只要我在该表中至少添加一行,例如:

INSERT INTO user_group_map values(2,1);
,我开始得到预期的结果


有人能告诉我发生了什么事吗?为什么?这是MySQL中的错误,还是预期的行为?如果是后者,我如何处理它?

您正在对用户、用户组、用户区域设置进行交叉连接,因此如果其中一个表为空,则不会返回结果,这有点像乘以零。。。你总是得零分。您可能需要研究其他类型的联接,例如左联接,它将包括特定表中的所有记录,即使其他表为空。

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

即使在应用WHERE子句之前,输入中的空表也将导致空输出集

你正在寻找的是一个外部连接谷歌它

一个使用MYSQL语法的示例,因为这是我最近使用的。

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

从多个联接中选择执行表的Cartessian乘积

具有空集的任何集合的Cartessian乘积始终为空


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

谢谢!我想你在询问中留下了一个小错误,但它帮助了我。以下是我的结论:从用户中选择不同的users.user\u id,users.email,users.irc\u昵称LEFT JOIN user\u group\u map USING user\u id LEFT JOIN user\u locale\u map USING user\u id其中1=1 group BY users.user\u id ORDER BY users.email;
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;