2014-12-01 2 views
1

안녕 나는 webrowser 게임을 만드는 중이라서 내가 오류를 얻을 때 내 데이터베이스에 괴물을 얻기 위해 노력하고 있어요 "하위 쿼리는 1 개 이상의 행을 반환"점점 오전 : 하위 쿼리가 반환보다 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

테이블에서 이름이 고유 한가요? –

+1

통계와 괴물 사이에 아무 관계가 없습니까? (내가 오늘 그걸 말하고 있다고 상상하지 못했습니다) – Strawberry

+2

값이 'Necroborg!'또는'atk '인 항목이 여러 개있을 수 있습니다. 하위 쿼리에서 한도 사용 – Aditya

답변

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); 

. 선택에서

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

0

문제는 다음 중 하나 또는 둘 다 :

  • 'Necroborg!'라는 이름의 두 개 이상의 몬스터가있다.
  • 'atk'이라는 이름의 stat 이상이 있습니다.

당신이하고 싶은 것을 결정해야합니다. 하나의 옵션 (다른 곳에서 언급 됨)은 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로 두 테이블을 연결하는 필드 있다는 것입니다. 그러나 테이블의 이름에 따라, 나는 그것이 사실이라고 생각하지 않습니다.