我为什么得到“Subquery返回超过1行”

时间:2014-12-01 11:01:33

标签: mysql sql

您好我正在制作一个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);

任何想法如何解决这个问题?

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 . . . selectcross 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。但是,根据表格的名称,我认为这不是真的。