这些是我(简化)的表格:
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添加到我的第一个查询中,看它是否是一个可变长度问题,但我仍然只得到一个结果。
答案 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;