2012-09-06 50 views
0

現在我只是開始進入連接,所以我可能錯過了它的一些核心理解,但這裏是我想要做的:我如何構建這個JOIN語句?在條件有問題

我有一個表配置文件和幾個表(角色,技能,職稱等)與一個profile_id,一些不相關的數據和一個value_id(一對一的關係)

用戶將輸入一個不同的value_ids數組,我想檢索所有配置文件的id一個與我們從用戶檢索到的值相匹配的value_id的對應表。

輸入中的某些值被指定爲僅與某個表(此例中的角色和行業)匹配,並且該部分現在正在工作。然而,我不能做的是檢查的任何是否匹配相關表格。


我不知道如何設計這個塊的樣式。抱歉。編輯:它自己設計。整齊。
在這個例子中,我有三個值。一個(88)被指定爲搜索某個角色,一個用於行業(128),第三個(73)必須匹配一組表中的至少一行。

SELECT DISTINCT(profiles.id) as id, 
FROM profiles 
INNER JOIN profile_experience_roles r ON(r.profile_id = profiles.id) 
INNER JOIN profile_experience_industries i ON(i.profile_id = profiles.id) 
INNER JOIN profile_experience_technology t ON(t.profile_id = profiles.id) 
INNER JOIN profile_wanted_roles w ON(w.profile_id = profiles.id) 
INNER JOIN profile_languages l ON(l.profile_id = profiles.id) 
WHERE r.value_id = 88 AND i.value_id = 128 AND 
(r.value_id = 73 OR i.value_id = 73 OR t.value_id = 73 OR w.value_id = 73 OR l.value_id = 73) 

最後一行是什麼導致的問題。任何幫助表示讚賞。

此外,我從未在此發佈過,所以我不知道我在做什麼。
感謝

+0

和出色的符號'編輯:標榜自己。 Neat.'!你做了我的晚上! :) –

回答

1

嘗試

WHERE r.value_id = 88 AND i.value_id = 128 AND 
73 IN (r.value_id, i.value_id, t.value_id, w.value_id, l.value_id) 

在你的情況,你應該能夠

WHERE r.value_id = 88 AND i.value_id = 128 AND 
73 IN (t.value_id, w.value_id, l.value_id) 

由於r.value_id去永遠是88 73.同樣的,i.value_id可以去't be 128 and 73.

請注意,INNER JOIN需要這些表的所有之間的連接來獲取任何行。

+0

沒想到IN關鍵字,謝謝! – Kloar

1

在加入差異的一個很好的例子是在這裏:What is the difference between "INNER JOIN" and "OUTER JOIN"?

內加入的原因可能。您可能正在加入不存在的ID,並且所有數據都沒有被返回。我還包括

試試這個羅賓在關於IN和刪除r.value的變化和i.value:這是

SELECT 
    DISTINCT(profiles.id) as id, 
FROM profiles 
RIGHT JOIN profile_experience_roles r ON(r.profile_id = profiles.id) 
RIGHT JOIN profile_experience_industries i ON(i.profile_id = profiles.id) 
RIGHT JOIN profile_experience_technology t ON(t.profile_id = profiles.id) 
RIGHT JOIN profile_wanted_roles w ON(w.profile_id = profiles.id) 
INNER JOIN profile_languages l ON(l.profile_id = profiles.id) 
WHERE profiles.id is not null AND r.value_id = 88 AND i.value_id = 128 AND 
    73 IN (t.value_id, w.value_id, l.value_id)