2012-01-31 2 views
1

일부 배경 나는 Skyrim에서 연금술 재료와 그 효과를 나타내는 일련의 데이터를 가지고 있습니다. 당신이 이것에 익숙하지 않다면 당신은 물약을 만들기 위해 2-4 개의 재료를 결합 할 수 있습니다. 각 재료에는 4 가지 효과가 있습니다. 재료들 사이의 효과가 동일하다면 그 종류의 묘약을 만들 것입니다. 내가 다 대다 관계로이 문제를 확인했습니다 내가 그렇게처럼 내 테이블을 설정 :MySQL을 처음 접 하시다 다 - 대 - 다 관계 쿼리

성분 : ing_id (키), ing_name (기타 추가 정보)

효과 : eff_id를 (키) , eff_id 내가 입력 2 이상의 사용 가능한 성분을 좋아하고 영향이 무엇인지 모른 채 가능한 조합을 반환

을 ing_id :

ing_eff_xref을 eff_name. 필자의 sql 경험은 phpMyAdmin과 간단한 select 쿼리에 상당히 제한되어 있습니다. 내 질문을 짐작 :이 관계의 유형에 대한 테이블 구조를 올바른 방법입니다, 만약 내가 테이블을 업데이 트 계획이 없으면 외래 키를 설정해야합니까, 거기에 집합을 취할 수있는 쿼리입니다 ing_names 및 교차하는 eff_names 만 반환합니까? 여기

아무도 관심이 경우 DB의 mysqldump는 다음과 같습니다 http://dl.dropbox.com/u/59699040/alchemy_db.sql

답변

1

이 이러한 유형의 관계에 대한 테이블을 구성 할 수있는 올바른 방법인가?

예, 그렇지만 성분 표에 대해 effect1부터 effect4까지 가질 필요는 없습니다.

테이블을 업데이트 할 계획이 없다면 외래 키를 설정해야합니까?

예. 이후 데이터를 가져 오는 유일한 방법은 3 개의 테이블을 함께 조인하는 것입니다. 외래 키 (또는 더 구체적으로 적절한 인덱스)가 없으면 쿼리에서 제대로 수행되지 않을 수 있습니다. 물론 전체 행 수가 적지 만 외래 키를 사용하면 이러한 유형의 시나리오를 따르는 것이 좋습니다.

ing_names 세트를 취할 수있는 검색어가 있습니까? eff_names 만 교차합니까?

WHERE i.ing_name IN ('Abecean Longfin ','Eye of Sabre Cat ','Bear Claws '); 

: 여러 성분의 효과를 볼 필요가 있다면, 당신은 당신의 WHERE 같은 절을 조정할 수

SELECT e.eff_name 
FROM ingredients i 
INNER JOIN ing_eff_xref ie ON ie.ing_id = i.ing_id 
INNER JOIN effects e ON e.eff_id = ie.eff_id 
WHERE i.ing_name = 'Abecean Longfin '; 

:

나는이 같은 후 것 같아요 중복 효과를 원하지 않으므로 SELECT DISTINCT를 사용하여이를 제거 할 수 있습니다.

스카이 림에 물약 효과가 있습니까?

SELECT e.eff_name, count(*) as value 
FROM ingredients i 
INNER JOIN ing_eff_xref ie ON ie.ing_id = i.ing_id 
INNER JOIN effects e ON e.eff_id = ie.eff_id 
WHERE i.ing_name IN ('Eye of Sabre Cat ','Bear Claws ') 
GROUP BY e.eff_name; 

"체력 복원"1의 값으로 6 개 효과를 나열 것이 쿼리가 스택의 할 수있는 경우에, 당신은 각 효과의 누적 값을 얻기 위해 COUNT와 GROUP BY 쿼리를 수행 할 수 있습니다 스카이 림 (Skyrim) 묘약이 이런 방식으로 작동하는지 확신 할 수 없지만, 단지 여분의 생각 일뿐입니다.

+0

저에게 다시 연락 주셔서 감사합니다. 두 번째 쿼리는 확실히 실행 가능한 솔루션입니다. 효과는 겹쳐지지 않지만 거기에 일치하는 효과가 두 개 이상 있기 때문에 PHP에서 1보다 큰 수의 효과를 추출 할 수 있습니다. 첫 번째 쿼리에서 무슨 일이 일어나고 있는지 모르겠지만 SELECT DISTINCT와 반대되는 것이 있다면 필요한 것입니다. 도움을 주셔서 감사합니다, 그것은 눈을 뜨게되었습니다. – pdizz

+0

도와 줘서 기쁩니다! 이것은 재미있는 일이었습니다. – Aaron

+0

이제 내가 뭘 찾아야할지 알고 있는데, 중복 된 것을 찾은이 기사를 찾았습니다. http://www.petefreitag.com/item/169.cfm 내가 HAVING (COUNT (email)> 1)을 추가 할 수 있었지만 eff_name을 사용하여 그것을 좁히십시오. – pdizz

관련 문제