这是我查询的一部分:
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
或if()
(中的条件逻辑只会使表达式复杂化。
现在您已经修复了这个问题,您可以开始修复您的数据模型了。 您在一列中存储多个值。 以下是一些不好的原因:
- 数字应使用正确的类型(不是字符串(存储。
- 连接表的 ID 应具有正确声明的外键关系,而您无法这样做。
- 数据库通常具有较差的字符串处理功能。
- 数据库具有用于存储列表的出色数据结构。 它被称为表而不是字符串。
- 在字符串中转储多个值会阻止对该列使用索引和分区,这会影响可伸缩性和性能。