mysql - FIND_IN_SET 和截断不正确的 DOUBLE 值错误
问题描述
这是我的查询的一部分:
select * from tb_test where IF(_Tags,
TAD.id IN (
SELECT T2.taggable_id as id FROM Tb_Taggables T2
WHERE T2.taggable_type = 'archives'
AND
FIND_IN_SET(T2.tag_id,_Tags)
)
,TRUE)
_Tags
有这样的价值:'377,379'
.
我的Tb_Taggables
桌子:
CREATE TABLE Tb_Taggables (
id bigint UNSIGNED AUTO_INCREMENT
PRIMARY KEY,
tag_id bigint UNSIGNED NOT NULL,
taggable_id bigint UNSIGNED NOT NULL,
taggable_type varchar(191) NOT NULL,
created_at timestamp NULL,
updated_at timestamp NULL
)
COLLATE = utf8mb4_unicode_ci;
但我收到此错误消息:
[22007][1292] (conn=29800) Truncated incorrect DOUBLE value: '377,379'
解决方案
为什么要使用条件表达式?
where (_Tags is null or
TAD.id IN (SELECT T2.taggable_id as id
FROM Tb_Taggables T2
WHERE T2.taggable_type = 'archives' AND
FIND_IN_SET(T2.tag_id, _Tags)
)
)
where
通常,子句 ( case
or )中的条件逻辑if()
只会使表达式复杂化。
现在您已经修复了该问题,您可以着手修复数据模型。您在列中存储多个值。以下是一些不好的原因:
- 数字应该使用正确的类型存储,而不是字符串。
- 连接表的 ID 应该正确声明外键关系,这是您无法做到的。
- 数据库通常具有较差的字符串处理功能。
- 数据库具有用于存储列表的出色数据结构。它被称为表而不是字符串。
- 在字符串中转储多个值会阻止在该列上使用索引和分区,这会影响可伸缩性和性能。
推荐阅读
- python - Appending dictionaries when in a for loop
- asp.net - 我无法访问在母版页中创建的公共数据集,在子页面中。我如何访问..?
- node.js - Node Cipheriv Warning in Azure DevOps Extension - Release Task
- java - 用Java从文本文件中读取数据
- html - 将图像放置在英雄文本右侧的最佳方法是什么(请参阅线框。)
- neo4j - 将 Neo4j 迁移到 Cosmos DB Graph 数据库
- python - 如何恢复全连接层中的权重子集?
- azure - AppService 无法部署我的大型站点
- django - Django模型和博客作者权限问题
- java - 为什么我的 if 语句没有启动我的活动?