2011-08-27 71 views
1

我已經搭了好幾個小時來得到一個特定的結果,並沒有在網上找到任何答案 - 因爲我不是SQL專家所有,我在這裏問一個問題。如何在連接3個表格時進行搜索,但排除其中一個表格的結果?

我有3個表:useridname ...),carsidtypecolorengine power ...)和中間表保存所有的用戶給了汽車的分數:scoresiduser_id,car_id,score)。

我試圖找到一個查詢,可能會返回一個特定用戶,所有的汽車,他還沒有評分。我試過以下,但它返回空:

$q=mysql_query("SELECT * FROM cars LEFT OUTER JOIN scores ON cars.id = scores.car_id WHERE scores.user_id != ('".$userId."')"); 

有人有線索嗎?

回答

2
SELECT 
    * 
FROM 
    cars 
WHERE 
    NOT EXISTS (SELECT 1 FROM scores WHERE car_id = cars.id AND user_id = ?) 

其中?是該特定用戶的ID。

scores中的複合索引(car_id, user_id)在此處非常有用。

+0

哇,它的作品完美,非常感謝暢想!我會檢查你談到的複合指數,從來沒有用過...... – BoDeX

2

你可以用小的修改使用代碼:

SELECT * FROM cars 
LEFT OUTER JOIN scores ON cars.id = scores.car_id and scores.user_id=".$userId." 
WHERE scores.id IS NULL 
+1

+1這是另一種選擇。儘管如此,恕我直言不像不存在表達。 – Tomalak

+0

這不是一個替代方案,這個查詢是完全不正確的。 – zapadlo

+0

@Zapadlo你能解釋你的評論嗎?什麼是完全不正確的這個查詢?我認爲在發佈這樣的評論之前,你應該閱讀更多關於sql和左連接:) –

1
SELECT * FROM 
car c 
WHERE c.id NOT IN (
    SELECT s.car_id 
    FROM score s, user u 
    WHERE u.id = s.user_id 
     AND u.id = ? 
) 
+0

你真的需要'user'表嗎? –

+0

編號[12更多...] – zapadlo

相關問題