我在编写正确的MySql查询时遇到问题。我想为id大于1000但小于10000的每个用户插入新的集合。
$conn = $this->em->getConnection();
$stmt = $conn->prepare('INSERT INTO collection (name, type)
values(:name, :type)
SELECT * FROM user WHERE id<:endUser AND id>:startUser');
$stmt->bindValue('name', 'Default');
$stmt->bindValue('type', 0);
$stmt->bindValue('startUser', 1000);
$stmt->bindValue('endUser', 10000);
$stmt->execute();
这是我试着写的,但是我得到了语法错误。请解释我如何纠正查询
UPD
我应该给出详细的表格结构。
集合
CREATE TABLE IF NOT EXISTS `collection` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`type` smallint(6) NOT NULL,
PRIMARY KEY (`id`),
KEY `IDX_FC4D6532A76ED395` (`user_id`)
);
用户
CREATE TABLE IF NOT EXISTS `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
);
用户与Collection有一对多的关系。
答案 0 :(得分:2)
使用SELECT INTO,您必须选择要在新行中放置的值,并且只选择那些值。你不要使用VALUES()子句。
当您对新行使用静态值而不是user
表中的值时,您可以这样做。
哦,我在你的编辑中看到你使用了错误的表格名称它应该是fos_user
此外,由于fos_user.user_id是NOT NULL
字段,您需要在插入字段列表中包含该列。
$conn = $this->em->getConnection();
$stmt = $conn->prepare('INSERT INTO collection (user_id, name, type)
SELECT id, 'default', 0
FROM fos_user
WHERE id > :startUser AND id < :endUser');
$stmt->bindValue('startUser', 1000);
$stmt->bindValue('endUser', 10000);
$stmt->execute();