2010-03-11 5 views
2

SQL에 ANDOR 절이 있습니다. 여기 내 쿼리입니다 :MySQL OR 절 문제

SELECT 
    `act1`.`name`, 
    `act1`.`surname`, 
    `act2`.`name`, 
    `act2`.`surname`, 
    `act3`.`name`, 
    `act3`.`surname` 
FROM 
    `videos`, 
    `actors` AS act1, 
    `actors` AS act2, 
    `actors` AS act3 
WHERE 
    `videos`.`ident` = 'something' 
    AND 
    (
     `act1`.`id` = `videos`.`id_actor1` 
     OR 
     `act2`.`id` = `videos`.`id_actor2` 
     OR 
     `act3`.`id` = `videos`.`id_actor3` 
    ) 

그것은 나에게 {name, surname}의 모든 변형을 반환하지만 존재하는 경우 나, 정확히 첫 번째, 두 번째 및 세 번째의 이름과 성을 원한다.

답변

4

같은 소리가 LEFT JOINS입니다.

사용 구문은 어쨌든되지 않습니다
SELECT 
`act1`.`name`, 
`act1`.`surname`, 
`act2`.`name`, 
`act2`.`surname`, 
`act3`.`name`, 
`act3`.`surname` 
FROM `videos` 
LEFT JOIN `actors` AS act1 ON (`act1`.`id` = `videos`.`id_actor1`) 
LEFT JOIN `actors` AS act2 ON (`act2`.`id` = `videos`.`id_actor2`) 
LEFT JOIN `actors` AS act3 ON (`act3`.`id` = `videos`.`id_actor3`) 
WHERE `videos`.`ident` = 'somethink' 

FROM 절에 리스팅을 테이블 이름 대신 JOINLEFT JOIN를 사용합니다.


모델을 향상시킬 수있는 것처럼 들리겠습니까? 동영상에 액터가 4 명 이상인 경우에는 어떻게됩니까? 교차 테이블 video_actors

  • VIDEO_ID
  • 를 사용

    그렇게 할 수 있도록 할

을 actor_id.

+0

+1 : 나보다 빠르고 데이터베이스를 정규화하는 것이 좋은 지적입니다. –

1

사용 조인 : 평가할 때 MySQL의 AFAIK Short-circuit evaluation을 수행

SELECT 
    `act1`.`name`, 
    `act1`.`surname`, 
    `act2`.`name`, 
    `act2`.`surname`, 
    `act3`.`name`, 
    `act3`.`surname` 
FROM `videos` 
JOIN `actors` AS act1 ON `act1`.`id` = `videos`.`id_actor1` 
LEFT JOIN `actors` AS act2 ON `act2`.`id` = `videos`.`id_actor2` 
LEFT JOIN `actors` AS act3 ON `act3`.`id` = `videos`.`id_actor3` 
WHERE `videos`.`ident` = 'somethink' 
+0

+1 또한 답변을드립니다. 모든 배우에게 'LEFT JOINS'을 사용하기로 결정했는데, 설명문은'INNER JOIN'만으로'actor1'에 충분하다고 (당신이 가진 것처럼) 들립니다. –

0

때문에 where 절 때문에 다른 배우 테이블 사이 경우, 데카르트 제품을 만드는. 이미 언급 된 다른 사람들처럼, LEFT JOIN이 훨씬 더 적용 가능합니다.

+0

세 명의 액터가 모두 실제로 설정되어있는 경우에만 작동합니다. 또한 암시 적 조인 표기법을 더 이상 사용하지 않아야합니다. –

+0

@Peter Lang : 내가 말했듯이, LEFT JOIN이 더 좋습니다. 그러나 이미 말한 것을 반복 할 필요는 없습니다. 부울 표현식을 평가하는 방법을 더 많이 또는 더 적게 지적하고 싶었습니다. 하지만 내 코드가 어쨌든 작동하지 않는다고 말하면 나는 당신을 믿는다;) –