두 번째 테이블에서 누락 된 행을 얻기 위해 두 테이블에 참여하는 방법


21

간단한 투표 시스템에서

CREATE TABLE elections (
election_id int(11) NOT NULL AUTO_INCREMENT,
title varchar(255),

CREATE TABLE votes (
election_id int(11),
user_id int(11),
FOREIGN KEYs

사용자가 투표 한 선거 목록을 얻기 위해 다음 JOIN이 사용됩니다.

SELECT * FROM elections
JOIN votes USING(election_id)
WHERE votes.user_id='x'

그러나 사용자가 투표하지 않은 선거 목록을 얻는 방법?

답변:


21

기존 쿼리를 사용하여 원하는 목록의 반대를 가져옵니다. 그런 다음 NOT IN을 통해 해당 목록을 확인하여 원하는 목록을 얻을 수 있습니다.

SELECT * FROM elections WHERE election_id NOT IN (
    SELECT elections.election_id from elections
    JOIN votes USING(election_id)
    WHERE votes.user_id='x'
)

17

외부 조인을 사용하십시오.

select e.election_id, e.title, v.user_id
from Elections e
 LEFT OUTER JOIN votes v ON v.election_id = e.election_id and v.user_id = @userid

특정 선거에 투표가 없으면 UserId가 비어 있습니다. 그렇지 않으면 표시됩니다

캐스트 투표가없는 선거 만 나열하려면 다음과 같이하십시오.

select *
from elections e
where election_id NOT IN 
 (select election_id
  from votes
  where user_id = @userid
 )

5

원하는 것을 달성 할 수있는 많은 방법이 있습니다. 아마도 가장 간단한 방법은 순전히 설정 지향 접근법을 사용하는 것입니다.

select election_id from elections
minus -- except is used instead of minus by some vendors
select election_id from votes where user_id = ?

선거에서 우리는 사용자가 투표 한 선거를 제거합니다. 선거 제목을 얻기 위해 선거와 결과를 결합 할 수 있습니다. 질문에 태그를 지정하지 않았더라도 MySQL을 사용하고 있다고 생각할만한 이유가 있으며 MINUS 또는 EXCEPT는 지원되지 않습니다.

다른 변형은 NOT EXISTS술어 를 사용하는 것입니다 .

select election_id, title 
from elections e
where not exists (
    select 1 
    from votes v
    where e.election_id = v.election_id
      and v.user_id = ?
);

즉, 사용자의 투표가없는 선거. NOT IN조건은 비슷한 방식으로 사용할 수 있습니다. 관련된 null이있을 수 있으므로 의미와 IN과 EXISTS가 다르다는 점에 주목할 가치가 있습니다.

마지막으로 외부 조인을 사용할 수 있습니다

select election_id, title 
from elections e
left join votes v
    on e.election_id = v.election_id
   and v.user_id = ?
where v.user_id is null;

ON 술어와 일치하는 행이 없으면 투표의 모든 열이 결과에서 널로 바뀝니다. 따라서 WHERE 절에서 votes의 열이 null인지 확인할 수 있습니다. 투표의 두 열이 모두 null 일 수 있으므로주의해야합니다.

이상적으로는 널로 인한 문제를 처리하지 않아도되도록 테이블을 수정해야합니다.

CREATE TABLE elections 
( election_id int NOT NULL AUTO_INCREMENT PRIMARY KEY
, title varchar(255) not null );

CREATE TABLE votes 
( election_id int not null
, user_id int not null
,     constraint pk_votes primary key (election_id, user_id)
,     constraint fk_elections foreign key (election_id)
                              references elections (election_id)
);   

-3
SELECT * 
FROM elections 
WHERE election_id NOT IN (
    SELECT DISTINCT(election_id) from votes
);

4
승인 된 답변이 특정 유권자가 투표하지 않은 선거를 이끌어 냈으므로 OP의 질문에 실제로 답변하지는 않습니다. 물론, 아무도 투표하지 않은 선거를하는 것은 다른 답변 중 하나를 약간 조정 한 것입니다. 그 효과에 대한 의견은 이것이 약간 더 나은 대답처럼 보일 수 있습니다. 아직도, 그림에서, 원숭이에게는 꽤 좋다! :-)
RDFozz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.