2010-03-11 50 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而不是列出的表名。


你的問題聽起來好像你可以改善你的模型。當一個視頻有三個以上的演員時會發生什麼?

使用一個交集表video_actors

  • VIDEO_ID
  • actor_id

會允許這樣做。

+0

+1:比我快,關於正常化數據庫的好處。 – 2010-03-11 18:45:39

1

使用聯接:

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',但是對於'actor1'來說,聽起來好像'INNER JOIN'就足夠了(就像你擁有它一樣)。 – 2010-03-11 18:56:24

0

因爲據我所知的MySQL評估時確實Short-circuit evaluation where子句,從而創造了笛卡爾乘積,在其他演員表之間的情況。正如其他人已經提到的,LEFT JOIN更適用。

+0

這隻有在所有三個演員實際設置時纔有效。另外,不應再使用隱式聯接表示法。 – 2010-03-11 18:54:10

+0

@Peter Lang:正如我所說的,「LEFT JOIN」更好。但是沒有必要重複你已經說過的話。我想或多或少地指出如何評估布爾表達式。但是如果你說我的代碼無法正常工作,我相信你;) – 2010-03-11 19:14:58