mysql - 如何更正此 MySQL 查询中的除法结果?
问题描述
我有这张桌子:
CREATE TABLE `mytable` (
`id` int(11) NOT NULL,
`value` longtext,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
有了这些数据:
id, value
--------------------
'1', '__cccccccc; Myword'
'2', '__ddddddd; Myword'
'3', 'OOO; myword; anotherword'
这个查询:
SELECT `mytable`.`value`
, LENGTH(`mytable`.`value`) 'string length'
, LENGTH(REPLACE(LOWER(`mytable`.`value`),'; myword','')) 'after replace'
, LENGTH(`mytable`.`value`) - LENGTH(REPLACE(`mytable`.`value`,'; myword','')) 'after sub'
, LENGTH(`mytable`.`value`) - LENGTH(REPLACE(`mytable`.`value`,'; myword',''))/8 'after divide'
FROM mytable
WHERE LOWER(`mytable`.`value`) LIKE '%; myword%'
OR LOWER(`mytable`.`value`) LIKE '%; myword';
而这个结果:
# value, string length, after replace, after sub, after divide
'__cccccccc; Myword', '18', '10', '8', '16.7500'
'__ddddddd; Myword', '17', '9', '8', '15.8750'
'OOO; myword; anotherword', '24', '16', '8', '22.0000'
插入语句:
INSERT INTO `test`.`mytable`
(`id`,
`value`)
VALUES
('1','__cccccccc; Myword'),
('2','__ddddddd; Myword'),
('3','OOO; myword; anotherword');
问题是最后一列结果不正确。例如,第一条记录的最后一列应该是 8/8,即 1。为什么我会得到这些结果?如何以最小的变化纠正它们?
注意:我需要使用 LOWER 将字符串转换为小写,因为 replace 区分大小写并且我的值区分大小写(我需要捕获关键字的任何出现,; myword
无论它包含大写字母还是小写字母,我不在乎。
编辑:
该查询旨在计算字符串; myword
出现的次数。所以我计算字段的长度,并在将我想计算的关键字替换为 nothing 后从字段的长度中减去它''
。然后将结果除以关键字字符串中的字符数(在我的情况下为 8)。
解决方案
问题的根源在于 REPLACE 区分大小写。所以选择语句应该是:
SELECT `mytable`.`value`
, LENGTH(`mytable`.`value`) 'string length'
, LENGTH(REPLACE(LOWER(`mytable`.`value`),'; myword','')) 'after replace'
, (LENGTH(`mytable`.`value`) - LENGTH(REPLACE(LOWER(`mytable`.`value`),'; myword',''))) 'after sub'
, (LENGTH(`mytable`.`value`) - LENGTH(REPLACE(LOWER(`mytable`.`value`),'; myword','')))/8 'after divide'
FROM mytable
WHERE LOWER(`mytable`.`value`) LIKE '%; myword%'
#OR LOWER(`mytable`.`value`) LIKE '%; myword';
您可以看到我LOWER()
在其中添加了每个内容REPLACE()
,因为 REPLACE() 区分大小写,并且您搜索带有小写字母的关键字,因此您必须将文本转换为小字母以捕获关键字的每次出现,尽管字母大小写。
使用此查询,您会得到以下结果:
# value, string length, after replace, after sub, after divide
'__cccccccc; Myword', '18', '10', '8', '1.0000'
'__ddddddd; Myword', '17', '9', '8', '1.0000'
'OOO; myword; anotherword', '24', '16', '8', '1.0000'
所以最后一列正确显示了该value
字段中关键字的出现次数。
推荐阅读
- php - 在 shopify 管理仪表板面板中显示额外的自定义信息
- processing - 处理切断堆栈跟踪
- php - PHP 致命错误:无法声明类 Stripe\\Stripe,因为该名称已在使用中
- javascript - If statement not working properly even though everything is right
- jquery - 如何以编程方式侦听 jquery 触发的点击
- ios - overrideUserInterfaceStyle 可以覆盖系统警报/操作表吗?
- python-3.x - 有什么方法可以使用python通过api删除完整的电子表格
- sql - 如何使用 Case 更新以下多列场景?
- keras - 如何在 keras 中使用 RNN 层的特殊状态向量提供密集层
- delphi - 用于系统文件功能的 Delphi 跨平台系统实用程序