如果使用了JOIN和COUNT,mysql为表中的记录提供NULL,但SELECT工作正常,为什么?
表1 表2如果使用了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
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