2011-04-12 3 views
2

안녕하세요. 나는 테이블을 묶어서 묶는 공통점이 있지만 의미있는 방식으로 덤프 할 수있는 올바른 방법을 찾아 내지 못합니다.공통 필드가있는 여러 테이블의 데이터를 덤프합니다.

기본적으로 사용자에게는 두 번의 테스트가 주어지며 각 테스트는 여러 번 수행 될 수 있습니다. 아래에 비슷한

사용자와 테스트에 대한 기본 테이블 정보를 저장 (우리는이 테이블의 주요 전화 할게) :

user_id  test  iteration completion_time 
    1   1   1    1:00 
    1   2   1    1:30 
    1   1   2    0:49 
    1   2   2    1:30 

각 테스트 페이지는 다음에서 제공하는 답변을 저장하기 위해 자신의 테이블이 있습니다 일부 페이지에는 많은 질문이 있기 때문에 이 샘플 테이블을 RESULTS라고 부르 겠지만 기본적으로 같은 테이블이 많이 있습니다.

user_id  test  iteration  q1 q2 q3 
    1   1   1   A B A 
    1   2   1   B B A 
    1   1   2   A B B 
    1   2   2   A B B 

이러한 결과 테이블은 기본적으로 결과를 저장, 플러스 정확하게 모든 테이블에 걸쳐 함께 결과를 묶어 충분한 정보 (다시 많습니다). 결과에 대해 하나의 테이블 만 사용하면 몇 백 개의 열이있는 테이블이 남았을 것이기 때문에이 방법으로 설정했습니다. 읽은 테이블은 권장되지 않았습니다.

그래서 여기서 문제는이 테이블을 함께 묶어서 결과를 얻는 방법을 찾아 낼 수 없다는 것입니다. 나는 조인과 유니온을 읽었고 아무도 제대로 된 것처럼 보지 못했다. 왜냐하면 나는 한 번에 ~ 10-15 개의 테이블에서 데이터를 가져와야하기 때문이다.

select m.*, a.*, b.*, c.* from main m, results_a a, results_b b, results_c c where a.user_id=m.user_id and b.user_id=m.user_id and c.user_id=m.user_id' 

그 작품의 라인을 따라 뭔가를하지만, 더 나은 방법이있을거야 -

나는 거대한 복잡한 선택 할 수 있습니다. 이 예제에서는 3 개의 결과 테이블 만 제공했다는 것을 명심하십시오. 실제 응용 프로그램에서는 15-20 개의 결과 테이블과 비슷합니다.

실제로 복잡한 것 외에도 일부 행의 중복을 반환하고 추가 논리를 넣고 싶다면 (예를 들어, 내가 전에 쿼리 한 데이터와 동일하지만 테스트 2에만 필요함) 그것은 훨씬 더 복잡해집니다. 그리고 정렬에 대해서도 말하지 않습니다.

내가 읽은 것부터 JOIN은 2 테이블이고 UNION은 열이 아닌 결과 행을 결합합니다.

나는 mysql 전문가가 아니라고 주장하지만 나는 이것을 게시하기 전에 조사했다. 나는 옳은 대답에 가까워 야하지만 단지 그것에 대해 타격을 가하지 않는 것처럼 느낍니다.

누구든지 안내를 해줄 수 있습니까? 내부 사용하려면

답변

1

시도 조인

SELECT m.*, a.*, b.*, c.* 
FROM main m 
INNER JOIN results_a a ON a.user_id = m.user_id 
INNER JOIN results_b b ON b.user_id = m.user_id 
INNER JOIN results_c c ON c.user_id = m.user_id 
WHERE m.user_id = x 

명시 적으로 열 이름을 구분 열 이름을 지정하고 난 당신이 방법으로 데이터베이스를 설계했다고 생각 별칭을

SELECT m.*, a.q1 as A_Q1, a.q2 as A_Q2, b.q1 as B_Q1, b.q2 as B_Q2 ... 
+0

확실하게 말하기에는 너무 이르지만 확실히 올바른 방향으로 나를 가리키고 있습니다. 정말 고마워! – jk2

0

을 지정하려면 당신을 조인을해야 할 것입니다. 대안 (대형, 정규화되지 않은 테이블)보다 소리가 좋습니다. 너는 무엇을 나가려 하는가? 모든 테스트를보고 사용자의 최고 점수를 결정하십시오.

그래서 여러 사용자가있는 테이블을 이해하면 (분명히). 각 사용자는 여러 개의 테스트를 수행 할 수 있습니다. 각 테스트는 여러 번 수행 될 수 있습니다.

select m.*, a.*, b.*, c.* from main m 
join results_a a 
on a.user_id = m.user_id and a.test_id = m.test_id and a.iteration_id = m.iteration_id 
join results_b b 
on b.user_id = m.user_id and b.test_id = m.test_id and b.iteration_id = m.iteration_id 
join results_c c 
on c.user_id = m.user_id and c.test_id = m.test_id and c.iteration_id = m.iteration_id 

테스트마다 사용자 당 1 행을 제공해야합니다. 사용자에 대해 특정 테스트를 원하면 다음을 추가하십시오.

where m.user_id = @userid and m.test_id = @testid 

그런 다음 사용자가 테스트를 위해 모든 반복을 볼 수 있습니다. 최신 반복합니다

: select top(1)를 ... 당신이 런에서 SELECT 문을 생성 할 필요가 없습니다

where m.user_id = @userid and m.test_id = @testid 
order by m.iteration_id desc 

당신은 질문이 설정되도록 뷰를 생성하는 것이 좋습니다 특정 테스트를 나타내는 시간.

관련 문제