您好我正在制作一个webrowser游戏,当我收到错误时,我正试图让怪物进入我的数据库: 子查询返回多于1行
这是我的代码
INSERT INTO monster_stats(monster_id,stat_id,value)
VALUES
( (SELECT id FROM monsters WHERE name = 'Necroborg!'),
(SELECT id FROM stats WHERE short_name = 'atk'),
2);
任何想法如何解决这个问题?
答案 0 :(得分:0)
尝试使用LIMIT 1
INSERT INTO monster_stats(monster_id,stat_id,value) VALUES ((SELECT id FROM monsters WHERE name = 'Necroborg!' LIMIT 1),(SELECT id FROM stats WHERE short_name = 'atk' LIMIT 1),2);
或者,如果您与2个表有关系,则可以使用“选择加入”和“加入”。
INSERT INTO monster_stats(monster_id,stat_id,value)
(SELECT monsters.id, stats.id, 2 as value FROM monsters
LEFT JOIN stats on monsters.id = stats.monsters_id
WHERE monsters.name = 'Necroborg!'
AND stats.short_name = 'atk'
)
从选择中插入MYSQL: http://dev.mysql.com/doc/refman/5.1/en/insert-select.html
答案 1 :(得分:0)
问题是以下一项或两项:
'Necroborg!'
的怪物。'atk'
的统计信息。您需要决定自己想做什么。一个选项(在别处提到)是使用limit 1
从每个语句中只获取一个值。
第二个选项是更好地指定where
子句,这样每个表只能获得一行。
另一种是插入所有组合。您可以使用insert . . . select
和cross join
:
INSERT INTO monster_stats(monster_id, stat_id, value)
SELECT m.id, s.id, 2
FROM (SELECT id FROM monsters WHERE name = 'Necroborg!') m CROSS JOIN
(SELECT id FROM stats WHERE short_name = 'atk');
第三种可能性是连接两个表的字段,例如monster_id
。但是,根据表格的名称,我认为这不是真的。