mysql-如果将表定义为MyISAM或InnoDB,SQL查询对COUNT(*)的计算结果不同
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql-如果将表定义为MyISAM或InnoDB,SQL查询对COUNT(*)的计算结果不同,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2284字,纯文字阅读大概需要4分钟。
内容图文
![mysql-如果将表定义为MyISAM或InnoDB,SQL查询对COUNT(*)的计算结果不同](/upload/InfoBanner/zyjiaocheng/886/7e99c23282ba4b4c9366ca9e61826415.jpg)
我正在运行一个MySQL数据库.
我有以下脚本:
DROP TABLE IF EXISTS `org_apiinteg_assets`;
DROP TABLE IF EXISTS `assessmentinstances`;
CREATE TABLE `org_apiinteg_assets` (
`id` varchar(20) NOT NULL default '0',
`instance_id` varchar(20) default NULL,
PRIMARY KEY (`id`)
) ENGINE= MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=1;
CREATE TABLE `assessmentinstances` (
`id` varchar(20) NOT NULL default '0',
`title` varchar(180) default NULL,
PRIMARY KEY (`id`)
) ENGINE= MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=1;
INSERT INTO assessmentinstances(id, title) VALUES ('14026lvplotw6','One radio question survey');
INSERT INTO org_apiinteg_assets(id, instance_id) VALUES ('8kp9wgx43jflrgjfe','14026lvplotw6');
看起来像这样
assessmentinstances
+---------------+---------------------------+
| id | title |
+---------------+---------------------------+
| 14026lvplotw6 | One radio question survey |
+---------------+---------------------------+
org_apiinteg_assets
+-------------------+---------------+
| id | instance_id |
+-------------------+---------------+
| 8kp9wgx43jflrgjfe | 14026lvplotw6 |
+-------------------+---------------+
然后,我得到以下查询(我将其简化为最简单的失败查询)
SELECT ai.id, COUNT(*) AS `count`
FROM assessmentinstances ai, org_apiinteg_assets a
WHERE a.instance_id = ai.id
AND ai.id = '14026lvplotw6'
AND a.id != '8kp9wgx43jflrgjfe';
当我运行查询时,我得到这个
null, 0
到现在为止,一切都很好.现在,这是我的问题,当我用ENGINE = InnoDB而不是ENGINE = MyISAM重新创建两个表并再次运行相同的查询时,我得到了:
'14026lvplotw6','0'
所以有两件事让我感到困惑:
>为什么我没有得到相同的结果?
>在第二种情况下,COUNT(*)在实际返回该行的值时如何返回0,因此应为1?
我迷路了,如果有人能向我解释这种行为,我将不胜感激.
编辑:
有趣的是,如果在查询末尾添加GROUP BY ai.id,则在两种情况下都可以正常工作,并且不返回任何行.
解决方法:
发生这种情况是因为您使用的是不带GROUP BY ..的聚合函数,在这种情况下,非聚合列的结果是不可预测的..(通常显示查询期间遇到的第一个值)
尝试添加GROUP BY
SELECT ai.id, COUNT(*) AS `count`
FROM assessmentinstances ai, org_apiinteg_assets a
WHERE a.instance_id = ai.id
AND a.id != '8kp9wgx43jflrgjfe'
AND ai.id = '14026lvplotw6'
GROUP BY ai.id;
请记住,SQL中不建议在group by中未提及的列存在时使用聚合,并且在大多数数据库和较新版本的mysql中(从5.7开始)不允许使用聚合
内容总结
以上是互联网集市为您收集整理的mysql-如果将表定义为MyISAM或InnoDB,SQL查询对COUNT(*)的计算结果不同全部内容,希望文章能够帮你解决mysql-如果将表定义为MyISAM或InnoDB,SQL查询对COUNT(*)的计算结果不同所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。