关键字中的Mysql以列表为字符串
@posts_tags变量将具有逗号分隔的ids ex:1,2,3,4值,IN关键字将其作为完整字符串。它只显示@posts\u标记中第一个id的结果 在(1,2,3,4)中效果很好,但在('1,2,3,4')中会显示1的结果,为什么 注意:由于限制,结果没有限制,我不能使用FIND_IN_SET,因为它不适用于分区修剪关键字中的Mysql以列表为字符串,mysql,mariadb,Mysql,Mariadb,@posts_tags变量将具有逗号分隔的ids ex:1,2,3,4值,IN关键字将其作为完整字符串。它只显示@posts\u标记中第一个id的结果 在(1,2,3,4)中效果很好,但在('1,2,3,4')中会显示1的结果,为什么 注意:由于限制,结果没有限制,我不能使用FIND_IN_SET,因为它不适用于分区修剪 posts\u tags是users\u preferences表中的文本字段 SELECT `posts_tags` INTO @posts_tags FROM `user
posts\u tags
是users\u preferences
表中的文本字段
SELECT `posts_tags` INTO @posts_tags
FROM `users_preferences`
WHERE `user_id` = 12;
SELECT
posts.post_id,
posts.owner_id
FROM `posts_main` AS posts
WHERE
posts.tag_id IN(@posts_tags)
ORDER BY posts.post_id DESC
LIMIT 50;
如果不在子查询中使用,in运算符将替换一个或多个or运算符:
SET@a:=2
在(1,2,3,4)中选择@a
是
选择@a=1或@a=2或@a=3或@a=4
由于在一个字符串中存储多个值,因此该字符串本身将用作单个值:
SELECT@a IN(“1,2,3,4”)
相当于
选择@a=“1,2,3,4”
提示:
通常,在运行EXPLAIN EXTENDED
之后,通过执行SHOW WARNINGS
可以得到转换后的语句:
>explain extended select @a IN ("1,2,3,4");
(output skipped)
> show warnings;
+-------+------+------------------------------------------------+
| Level | Code | Message |
+-------+------+------------------------------------------------+
| Note | 1003 | select @`a` = '1,2,3,4' AS `@a IN ("1,2,3,4")` |
+-------+------+------------------------------------------------+
1 row in set (0.000 sec)
通过以下步骤实现了这一点,分区修剪的效果非常好
BEGIN
SELECT `posts_tags` INTO @posts_tags FROM `users_preferences` WHERE `user_id` = 12;
PREPARE stmt FROM CONCAT("EXPLAIN PARTITIONS SELECT posts.post_id,posts.owner_id FROM `posts_main` AS posts WHERE posts.tag_id IN(" ,@posts_tags, ") ORDER BY posts.post_id DESC;");
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END
我创建了一个多对多表,用于存储用户选择的标记(INT),并在still中放置了一个子查询,其中的内容被认为是字符串而不是整数列表。将CSV解析为单独的值。例如,使用JSON_TABLE()。