Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.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
如果使用了JOIN和COUNT,mysql为表中的记录提供NULL,但SELECT工作正常,为什么?_Mysql - Fatal编程技术网

如果使用了JOIN和COUNT,mysql为表中的记录提供NULL,但SELECT工作正常,为什么?

如果使用了JOIN和COUNT,mysql为表中的记录提供NULL,但SELECT工作正常,为什么?,mysql,Mysql,表1 表2 CREATE TABLE IF NOT EXISTS `com_msg` ( `msg_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `msg_to` int(10) NOT NULL, `msg_from` int(10) NOT NULL, `msg_new` tinyint(1) unsigned NOT NULL DEFAULT '1', `msg_content` varchar(300) NOT NULL, `m

表1

表2

 CREATE TABLE IF NOT EXISTS `com_msg` (
 `msg_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `msg_to` int(10) NOT NULL,
 `msg_from` int(10) NOT NULL,
 `msg_new` tinyint(1) unsigned NOT NULL DEFAULT '1',
 `msg_content` varchar(300) NOT NULL,
 `msg_date` date NOT NULL,
 `bl_sender` tinyint(1) unsigned NOT NULL DEFAULT '0',
 `bl_recip` tinyint(1) unsigned NOT NULL DEFAULT '0',
 PRIMARY KEY (`msg_id`),
 UNIQUE KEY `msg_id` (`msg_id`)
 ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
使用查询时:

 CREATE TABLE IF NOT EXISTS `ac_vars` (
 `user_id` int(10) unsigned NOT NULL,
 `ac_ballance` smallint(3) unsigned NOT NULL DEFAULT '0',
 `prof_views` mediumint(8) unsigned NOT NULL DEFAULT '0',
 PRIMARY KEY (`user_id`),
 UNIQUE KEY `id` (`user_id`)
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
我得到:

SELECT ac_ballance, prof_views, COUNT( msg_id ) AS messages
FROM ac_vars
INNER JOIN com_msg ON user_id = msg_to 
WHERE user_id =".$userid." AND com_msg.msg_new =1;

但是,使用Select语句仅在ac_变量上获得正确的值,正确的方法是什么

即使在表
com\u msg
中没有相应的行,您也需要表
ac\u vars
中的行。 因此,您必须使用
左联接

ac_ballance=NULL(incorrect)
prof_views=NULL(incorrect)
messages=0(correct)
请注意,条件

SELECT ac_ballance, prof_views, COUNT( msg_id ) AS messages
FROM ac_vars
LEFT JOIN com_msg 
ON user_id = msg_to AND com_msg.msg_new =1
WHERE user_id =".$userid.";
必须是
JOIN
条件的一部分,而不是
WHERE
子句,因为com_msg中没有满足此条件的值

注意

添加

com_msg.msg_new =1

不需要MySQL优化,因为这些列中的值直接依赖于<代码> USER ID 和<<代码> < < /Cult>子句只允许一行。

您期望的输出是什么?如果您愿意,请考虑以下简单的两步过程:1。如果您还没有这样做,请提供适当的DDL(和/或SQLFIDLE),以便我们可以更轻松地复制问题。2.如果尚未这样做,请提供与步骤1中提供的信息相对应的所需结果集。ac_balance=0,prof_views=0,messages=0,因为ac_vas的默认值为0如果没有与
WHERE
子句匹配的行,为什么在
ac_balance
prof_views
中需要非空值?这些必须来自一个匹配的行,并且没有任何匹配行。问题是在本地主机上,它按预期工作“为ac_vars提供数值”,但由于某些原因,在live server上提供空值“相同的数据库、服务器、结构等,但我仍然不明白为什么它在本地主机上工作,即使它不正确?@bart在不知道数据的情况下不能这么说。但通常我不会试图解释为什么错误的方法会返回所需的数据。
GROUP BY ac_ballance, prof_views