2012-04-20 2 views
0

에 따라 SQL 선택 :내 데이터베이스에 몇 테이블이 특정 데이터

  1. user 테이블 : user_id (primary key), first_name, last_name, email_address.
  2. inst 표 : inst_id (primary key), inst_nametype.
  3. user_insts 테이블 : user_insts_id (primary key), user_insts_status, inst_name (foreign key)user_id(foreign key).

내 웹 사이트에이를 사용하고 있는데 나는 그것이 inst 테이블에 대한 inst_name 열에서 져야 할 엔트리를 모두 표시해야하지만 오른쪽 또는 다른 쇼에서 특정 ID에 대해서만 져야 할 엔트리 null로. 다음과 같은 몇 가지 방법을 시도했습니다.

SELECT inst.inst_name,inst.inst_id,user_insts.user_id,user_insts.inst_name 
FROM inst LEFT JOIN user_insts ON inst.inst_name=user_insts.inst_name; 

SELECT inst.inst_name,inst.inst_id,user_insts.user_id,user_insts.inst_name 
FROM inst LEFT JOIN user_insts ON inst.inst_name=user_insts.inst_name 
WHERE user_insts.user_id='11'; 

도움이 될만한 모든 도움을 주실 수 있습니다.

는 편집 :

이 내가 현재 무엇을 얻을 수 있습니다 :

inst_name inst_id user_id: 
ASB   1  11 
BNZ   3  11 
FMG   5  11 
내가 더 이런 식으로 뭔가를 얻을 수 있기를 기대했다

:

inst_name inst_id user_id: 
ASB   1  11 
ANZ   2  NULL 
BNZ   3  11 
paymark  4  NULL 
FMG   5  11 
STATE   6  NULL 
+1

오른쪽의 오른쪽에있는 결합의 의미는 무엇입니까? 또한 이드는 당신의 테이블 필드에 관해 언급하고 있습니까? –

+0

왼쪽 가입을 사용 중이며 오른쪽 결과가 필요하십니까? –

답변

0

을 추가하여 USER_ID로 결과를 제한 할 수 있습니까?

  1. 질의 1 : user_id
  2. 쿼리 2에 의해 필터링되지 않은 모든 inst + user_insts 항목 만 보여줍니다 : 인 쿼리 2에 무슨 일 user_id

에 의해 필터링 단지 inst + user_insts 항목을 보여줍니다 where 그 절은 조인 된 조인 된 테이블을 필터링합니다. , 당신은 inst 테이블의 모든 항목과이 가입 LEFT 할

SELECT ui.inst_name, ui.user_id FROM user_insts ui WHERE ui.user_id = :PARAM 

을 다음 : 나는 당신이 일이 원하는 것은 처음과 같이 특정 user_id에 의해 결과 (user_insts)의 오른쪽을 필터링 할 것 같다 필터 후. inst 테이블에 실제로 결합하기 전에 user_id으로 먼저 필터링하기 위해 내부 뷰를 사용할 수 있습니다.

SELECT i.inst_name, ui.user_id 
FROM inst i 
LEFT JOIN user_insts ui ON i.inst_name = ui.inst_name AND ui.user_id = :PARAM 

이 다른 쿼리가 유효한 구문의 경우 내가 그렇게 잘 모르겠어요 MySQL을 너무 잘 알고 아니에요,

SELECT i.inst_name, filtered_ui.user_id 
FROM inst i 
LEFT JOIN (SELECT ui.inst_name, ui.user_id 
      FROM user_insts ui 
      WHERE ui.user_id = :PARAM) filtered_ui 
ON i.inst_name = filtered_ui.inst_name 

더 그것에 대해 생각 : 결과 쿼리는 다음과 같이해야한다 ... 내면보다 단순 할 수도 있습니다.

가입하기 전에 먼저 필터링을 수행해야하므로 모든 inst_names이 표시됩니다.

+0

정말 고마워요. :) 이것이 완벽하게 작동했습니다. 최종 쿼리에서 나에게 줬던 것입니다. 다시 감사합니다 :) – user1345603

0

당신의 문제는 아니다 100 % 명확하므로 각 사용자에 대해 inst_name을 표시하려고한다는 가정을하고 있습니다. inst 항목이 없을 때 inst_name을 null로 표시합니다. 이 같은

뭔가 작업을해야합니다 :

select u.user_id, i.inst_name 
from user u 
left join user_insts ui on ui.user_id = u.user_id 
left join inst i on i.inst_name = ui.inst_name 

당신은 당신의 제공 쿼리는 다음과 같은 결과가 보여 마십시오

where u.user_id = '11' 
1

원래 쿼리에서 수행 할 작업은 inst 테이블의 모든 행을 가져온 다음 user_insts 테이블에 일치하는 행이 inst_name에 있는지 확인하는 것입니다. 있으면 테이블에서 데이터를 반환합니다. 그렇지 않으면 NULL을 리턴합니다. JOIN을 INNER JOIN으로 변경하면 오른쪽이 일치하는 행만 반환됩니다. 이와 같이 :

SELECT inst.inst_name,inst.inst_id,user_insts.user_id,user_insts.inst_name 
FROM inst INNER JOIN user_insts ON inst.inst_name=user_insts.inst_name 
WHERE user_insts.user_id='11'; 

하지만 스키마를 변경해야합니다. inst에 정수 기본 키가 있으므로 inst_name의 외래 키로 inst_name 대신이 값을 사용해야합니다.

+0

+1 "스키마 변경"에 대한 설명 –

+0

Ive가 원래 쿼리를 편집하여 조금 더 명확하게되었습니다. – user1345603

관련 문제