Mysql 如何将变量用作in()中的组_concat的结果

Mysql 如何将变量用作in()中的组_concat的结果,mysql,transactions,Mysql,Transactions,以下是我已经(简化)的表格: 这是我的代码: SET AUTOCOMMIT=0; START TRANSACTION; SELECT @pids := GROUP_CONCAT(CONVERT(pid , CHAR(8))) FROM `mytable` WHERE `mydate` BETWEEN '2014-01-01' AND '2014-10-31'; INSERT INTO pictures_2014 SELECT * FROM `pictures` where pid in

以下是我已经(简化)的表格:

这是我的代码:

SET AUTOCOMMIT=0;
START TRANSACTION;
SELECT @pids := GROUP_CONCAT(CONVERT(pid , CHAR(8)))
FROM  `mytable`
WHERE  `mydate`
BETWEEN  '2014-01-01'
AND  '2014-10-31';
INSERT INTO  pictures_2014 SELECT * FROM `pictures` where pid in(@pids);
COMMIT;
pictures_2014中只插入了一项,即逗号分隔列表中的第一项

我预期的结果是,将复制与我的第一个查询匹配的所有4111行(至少是
图片中的那些)。
我确实知道phpmyadmin中所示的组中至少有前6个PID存在于表格图片中

我还尝试将LIMIT 0100添加到我的第一个查询中,以查看它是否是一个可变长度的问题,但我仍然只得到一个结果。

您所做的工作比您必须做的要多-将多个值合并到一个字符串中会遇到所有问题,而现在您遇到了问题,因为
中的
希望使用多个字符串价值观

为什么不这样做呢:

SET AUTOCOMMIT=0;
START TRANSACTION;
INSERT INTO  pictures_2014 SELECT * FROM `pictures`
where pid in(
  SELECT pid
  FROM  `mytable`
  WHERE  `mydate`
  BETWEEN  '2014-01-01'
  AND  '2014-10-31');
COMMIT;

这就是我学到的: 正在设置的变量被解释为“321654987”,而不是“321”、“654”和“987” ()

通过更改IN()来查找_IN_SET(),我得到了正确的结果

SET AUTOCOMMIT=0;
START TRANSACTION;
SELECT @pids := GROUP_CONCAT(CONVERT(pid , CHAR(8)))
FROM  `mytable`
WHERE  `mydate`
BETWEEN  '2014-01-01'
AND  '2014-10-31';
INSERT INTO  pictures_2014 SELECT * FROM `pictures` where FIND_IN_SET(pid,@pids);
COMMIT;

pictures表结果和mytable结果中都有4111个结果,建议的方法需要时间out@Traveling_Monk-4111结果不是很多数据。如果需要很长时间来处理,您可能需要寻找一些关于分析性能和索引的通用指南。事实是@pids处理不正确,我想知道原因。实际上,您编写的查询将有4111x4111=16900321个结果,子查询将在每次主查询运行时运行。进一步研究后,出于我的目的,FIND_IN_SET不起作用,似乎1024个字符是FIND_IN_SET(str,strlist)第二个参数中的最大可用大小我发现了这一点,因为我的pid是6位数字,146条记录是该事务将插入的最大值,因此逗号为6+1,引号为2((6+1)*146)+2=1024ok。另一个测试发现限制不在函数中,而在变量长度中。。。选择长度(@pids)==1024
SET AUTOCOMMIT=0;
START TRANSACTION;
SELECT @pids := GROUP_CONCAT(CONVERT(pid , CHAR(8)))
FROM  `mytable`
WHERE  `mydate`
BETWEEN  '2014-01-01'
AND  '2014-10-31';
INSERT INTO  pictures_2014 SELECT * FROM `pictures` where FIND_IN_SET(pid,@pids);
COMMIT;