关键字中的Mysql以列表为字符串

关键字中的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_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 `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()。