2010-08-19 2 views
2

나는 협회에 등록 된 사람들을 관리하기위한 작은 도구를 쓰고 있습니다.SQL : 1 대 다수, 단 하나만 선택

테이블이 USERS이고 테이블이 CARDS입니다. 각 사용자는 카드가 만료되어 하나 이상의 카드를 가질 수 있습니다.

한 가지 질문으로 가장 최근의 카드 (필드 : ISSUEDATE)에 대해서만 모든 사용자 정보와 모든 카드 정보를 추출하고 싶습니다.

USERS 테이블

IDUSER NAME SURNAME 
------------------------ 
1  Robert Hill 

카드 테이블

기본적으로
IDCARD IDOWNER ISSUEDATE DESC 
---------------------------------------- 
1  1  2010-01-01 'CARD ONE' 
2  1  2010-08-18 'CARD TWO' 

내가 다시 내 질문이 분야에서 좀하고 싶습니다 : 여기

는 매우 기본적인 예입니다 :

0 나는 시도,하지만 난 관리 할 수 ​​없습니다 :(

편집 : 사용자에 연결된 카드가없는 경우 어떻게됩니까 ? (한 명의 사용자가 등록되었지만 협회에서 아직 카드를주지 않았 음). 사용자 정보를 다시 가져 오기 위해이 쿼리를 적용 할 수있는 방법이 있습니까? 아이디어는 각 사용자에 대해 가능한 모든 정보를 얻는 것입니다. 이 정보는 나중에 ExtJS 응용 프로그램에서 JSON을 통해 사용됩니다.

답장을 보내 주셔서 감사합니다. "LIMIT 1 그래서, 예외입니다,

select u.IDUSER, u.NAME, u.SURNAME, 
     c.IDCARD, c.IDOWNER, c.ISSUEDATE, c.DESC 
from USERS u 
join CARDS c on u.IDUSER = c.IDOWNER 
order by c.ISSUEDATE desc 
LIMIT 1 
+0

스택 오버플로에 대해 수 많은 다른 유사한 질문에 대해서는 'group-n-per-group'태그를 따르십시오. –

+0

"사용자에게 연결된 카드가 없으면 어떻게됩니까?" 무슨 일이 일어나길 원하니? 레코드를 리턴 할 수 없거나 CARDS 테이블의 레코드 필드를 널 (NULL)로 설정할 수 있습니다. – strager

+0

예, 제 편집이 명확하지 않았습니다. 죄송합니다. 가장 좋은 방법은 사용자가 아직 카드가없는 경우 모든 CARDS 열에 대해 NULL 값 집합을 얻는 것입니다. – Danilo

답변

1

옵션 1 쿼리를 EXISTS 하나만 선택하십시오.

LEFT JOIN 당신은 또한 카드 데이터가없는 사용자를

(카드 데이터는 당신이 당신의 의지에 그것을 표시 할 ifnull(desc, 'No Card Issued')를 사용할 수 NULL 예정) 및 하위 쿼리가 보장있을 것이라는 점을 보장하는 사용자에 대한 가장 최근의 카드 데이터 선택됩니다.

SELECT * 
    FROM users u 
     LEFT JOIN cards c 
     ON c.idcard = (SELECT idcard 
          FROM cards c1 
         WHERE c1.idowner = u.iduser 
         ORDER BY issuedate DESC 
         LIMIT 1) 
1
select u.IDUSER, u.NAME, u.SURNAME, 
     c.IDCARD, c.IDOWNER, c.ISSUEDATE, c.DESC 
from USERS u 
join CARDS c on u.IDUSER = c.IDOWNER and c.IDCARD in (
    /* select biggest IDCARD numbers that has same IDOWNER thus eliminating multiple rows and remaining only 1 for each IDOWNER */ 
    select MAX(IDCARD) as IDCARD 
    from USERS join CARDS on USERS.IDUSER = CARDS.IDOWNER 
    group by CARDS.IDOWNER 

) 
+0

왜 IN 절에서 조인 된 선택입니까? 'MAX (IDCARD)를 IDCARD 그룹으로 선택하십시오. CARDS.IDOWNER'만으로도 충분합니다. –

1

Altho LIMIT은 일반적으로 MySQL의 서브 쿼리에 alowed되지 LIMIT와

select u.IDUSER, u.NAME, u.SURNAME, 
     c.IDCARD, c.IDOWNER, c.ISSUEDATE, c.DESC 
from USERS u 
join CARDS c on u.IDUSER = c.IDOWNER 
where not exists (select 1 from CARDS where IDOWDER = u.IDUSER and ISSUEDATE > c.ISSUEDATE) 

옵션 2 : NOT와

관련 문제