如何在IN()中使用变量作为group_concat的结果

时间:2015-01-23 06:32:28

标签: mysql transactions

这些是我(简化)的表格:

mytable
--------------------
`pid` int(11) NOT NULL AUTO_INCREMENT
`mydate` date NOT NULL,

pictures
--------------------
`pid` int(11) NOT NULL AUTO_INCREMENT
`image_name` varchar(255)

pictures_2014
--------------------
`pid` int(11) NOT NULL AUTO_INCREMENT
`image_name` varchar(255)

这是我的代码:

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;

只有一个项目插入到picture_2014中,这是逗号分隔列表中的第一项。

我期望的结果是所有与我的第一个查询匹配的4111行(至少是pictures中的那些行)将被复制。 我知道至少phpmyadmin中显示的group_concat中的前6个pid存在于表格图片中 我也尝试将LIMIT 0,100添加到我的第一个查询中,看它是否是一个可变长度问题,但我仍然只得到一个结果。

2 个答案:

答案 0 :(得分:0)

您正在做的工作比以往更多 - 您要解决将多个值组合到一个字符串中的所有麻烦,现在您遇到了问题,因为IN想要使用多个值。

为什么不能这样:

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;

答案 1 :(得分:0)

好的,这就是我学到的: 被设置的变量被解释为'321,654,987'而不是'321','654','987'  (Thanks @John Woo

通过将IN()更改为FIND_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;