2012-03-20 4 views
0

나는 MYSQL에 꽤 익숙하다. 여러 테이블에서 검색 할 쿼리를 작성하려고하지만 쿼리의 첫 번째 조건 만 평가하는 것처럼 보입니다. 내가 개발 한 쿼리는 다음과 같습니다다중 테이블 쿼리

SELECT DISTINCT user.user_id, user_netid, user_firstname, user_lastname, 
    user_dmid, user_insnum, instype_id, user_birthday, user_insapproved 
FROM user, signup, event 
WHERE (user.instype_id = 3 OR user.instype_id = 4) 
    AND signup.signup_attended =1 AND signup.signup_timestamp >= 1325376000 
    AND (event.activity_id=37 OR event.activity_id=40 OR event.activity_id=5); 

나는 꽤 오랫동안 알고 있지만, 내가 말했듯이, 나는이에 새로 온 사람과 내가 가지고 올 수있는 최선이었다. 어쨌든, signup.signup_attended! = 1 또는 user.instype_id 다음에 나타나는 다른 조건이있는 레코드를 제공하기 때문에 user.instype_id 만 평가하는 것으로 보입니다. 누군가 내가 잘못하고있는 것을 보여 주실 수 있습니까?

+2

쿼리를 적절한 조인 유형 구문으로 다시 작성해야합니다. 지금은 3 개의 테이블 중에서 선택하고 있지만 테이블 간의 관계를 지정하지 않으므로 데카르트 조인으로 끝나면 많은 나쁜 결과를 가져다 줄 것입니다. –

+0

스택 오버플로에 오신 것을 환영합니다! 나는 항상 새로운 사용자에게 감사의 표시 방법은 upvotes (일단 명성 점수 20 점을 얻음)와 대답을 수락 (대답 옆의 체크 표시)하는 것이라고 상기시킵니다. 질문이 있으시면 [FAQ], 특히 [ASK] –

답변

0

내 생각 엔이 작업은 교차 결합 (쉼표가있는 테이블 목록 ... 그러나 결합 문이 없음) 때문에 발생합니다. 기본적으로 인스턴트 유형의 사용자는 걸러 낼 수 있지만 user 테이블과 signup 테이블이 연결되어 있지 않기 때문에 사용자가 여전히 signup_attended으로 표시됩니다. 그러면 테이블이 함께 병합되기 시작합니다. 어쩌면 wikipedia can explain a cross join better than I can :) 당신은 여기 JOIN

를 사용하여 코드를 다시 작성할 필요

은 (조인 C 럼에 추측으로) 나중에 같이

SELECT DISTINCT user.user_id, user_netid, user_firstname, user_lastname, 
    user_dmid, user_insnum, instype_id, user_birthday, user_insapproved 
FROM user 
    JOIN signup 
     ON signup.user_id = user.id 
    JOIN event 
     ON event.signup_id = signup.id 
WHERE (user.instype_id = 3 OR user.instype_id = 4) 
    AND signup.signup_attended =1 AND signup.signup_timestamp >= 1325376000 
    AND (event.activity_id=37 OR event.activity_id=40 OR event.activity_id=5); 

가입 SQL에 구글을 수행 할 무엇의 예입니다 그리고 당신은 이것을 설명하는 좋은 정보를 얻어야합니다. Here is one tutorial

+0

을 참조하십시오. 알겠습니다. 감사. 그 형식을 사용하여 쿼리를 다시 작성했습니다. 그러나 이제는 단 하나의 레코드 만 발견되었으며 이러한 조건을 충족하는 레코드가 두 개 이상 있다는 것을 알고 있습니다. 나는 "DISTINCT"를 없애려고했지만 같은 결과를 얻었습니다. – thuey

+0

는 이제 다음과 같습니다 SELECT user.user_id, user_netid, USER_FIRSTNAME, user_lastname, user_dmid, user_insnum, instype_id, user_birthday, 사용자 FROM 이 가입 ON 일정 가입 signup.user_id = user.user_id ON 가입 가입 user_insapproved .schedule_id = schedule.schedule_id JOIN 이벤트 ON event.event_id = schedule.event_id WHERE (사용자.instype_id = 3 또는 user.instype_id = 4) AND signup.signup_attended = 1 AND signup.signup_timestamp> = 1325376000 AND (event.activity_id = 37 또는 event.activity_id = 40 OR event.activity_id = 5); – thuey

+2

쿼리 자체가 이제 소리가납니다. 질문에 샘플 데이터를 제공하거나, SQLFiddle.com (몇 가지 테이블을 설정하는 것 이상으로 어려울 수도 있음)을 사용하거나, 이와 같은 문제를 디버깅 할 때 필터를 제거하기 시작할 때 사용하는 방법을 사용해야합니다 더 많은 결과를 얻을 때까지 하나씩 이것은 적어도 어떤 필터가 너무 엄격한 지 알려줄 것입니다. 여기에는 너무 엄격한 JOIN이 될 수 있으므로 JOIN 문 중 일부를 LEFT JOIN으로 만드는 작업이 포함됩니다. LEFT JOIN을위한 구글은 당신이 확실하지 않다면 무엇을하는지 분명히해야합니다 :) –

0

여기에 몇 가지 사항을 수정해야합니다. 액세스하는 모든 값은 테이블과 연관되어야합니다. 첫 번째 값인 "user.user_id"는 작동하지만 나머지는 테이블과 연결되어 있지 않습니다 (그것이 의미가있는 경우).

사용중인 테이블 레이아웃을 제공 할 수 있습니까?

0

사용 하나 구문 :

select * from user 
join signup on user.userPrimaryKey=signup.userForeignKey 
where conditions... 

나 :

마크 B처럼
select * from user,signup 
where user.userPrimaryKey=signup.userForeignKey AND condition... 

당신이

(테이블의 모든 행이 다른 테이블의 모든 행에 연결합니다) 카티을 조인하고 말했다