2011-11-24 46 views
3

我有一個MySql數據庫中的三個表,我加入查詢獲取ID /值對。如何刪除不必要的加入,更新在哪裏條件

| A  |  B  |  C   | 
    | -------- |--------------|---------------| 
    | id  | id   | id   | 
    | name | fooId  | attributeId | 
    | desc | value  | displayIndex | 
    | ... | attributeId | ...   | 

我現在擁有的是:

SELECT C.id, B.value 
    FROM A, B, C 
    WHERE A.id = B.attributeId 
    AND A.id = C.attributeId 
    AND B.fooId = 25 
    ORDER BY C.displayIndex 

所以基本上我們通過加入A. B和C這曾經是在C表中的條目必須有一個相應的(父)在A表中輸入。但是,這將不再是這種情況。 C表仍將大部分由A表控制,但是,有些情況下我們需要C表中的獨立(始終)條目。

編輯

我希望所有的B和C匹配屬性ID的記錄,但我也希望任何記錄,其中C.attributeId = -1。有人可以幫助我用這個查詢來做什麼嗎?

編輯#2

基於反饋和建議,你們取得了一些谷歌上搜索我現在有這樣的:

(SELECT C.id, B.value, C.displayIndex 
    FROM B, C 
    WHERE B.attributeId = C.attributeId 
    AND B.fooId = 25) 

UNION 

(SELECT C.id, null, C.displayIndex 
    FROM C 
    WHERE C.attributeId = -1) 

ORDER BY 3 

是否有更好的怎麼辦呢? UNION有什麼問題嗎?

+1

如果沒有A記錄,將有做個B紀錄屬性Id = -1(與C記錄匹配)還是fooId = 25是唯一標識所需B記錄的方法? –

+1

爲我澄清....你是否希望自己獲得b.id,c.value,還是試圖在同一個查詢中獲取這些值和正常的a,b,c設置?這可以通過一個聯合聲明來完成(以亞當的答案和聯合聲明爲你的第一個聲明)。如果你不希望聯合...加入到一個給c.id的子查詢,b.value也可以。不知道這是你要求的。 – Twelfth

+0

我試圖解釋我能做到的最好,如果不夠清楚,真的很抱歉。聯盟的想法聽起來可能是我想要的。我想要所有匹配attributeId的記錄,但我也想要C = -1的任何記錄。這就是我所說的「永遠在線」。 – kasdega

回答

5

我已經更新了我的答案,解決了來自OP的編輯問題。

這將返回所有記錄where the attributeId for tables B and C match
B.fooId = 25, OR C.attributeId = -1
C.attributeId = -1並且在B表不匹配,NULL將代替B.Value,出現基礎上,Edit #2從OP

SELECT C.Id, B.Value, C.displayIndex 
FROM C 
LEFT JOIN B ON C.attributeId = B.attributeId 
WHERE B.fooId = 25 
    OR C.attributeId = -1 
ORDER BY C.DisplayIndex ASC 
+0

我在OP中不夠清楚。請參閱我的編輯。這確實有幫助,但這不是我想要的。 – kasdega

+0

謝謝,這正是我想要的。 – kasdega

+0

這個問題有沒有更好的標題btw?我覺得它的基地只是不知道該怎麼說。 – kasdega

0

你可能得到一個笛卡爾乘積可以接受退貨。

像亞當溫格說,你需要內部加入他們。當所有連接的表格中至少有一個匹配時,內部連接將返回行。

如果您需要確保結果也列在表A,你將需要加入一個太:

SELECT c.Id, b.Value 
FROM B 
INNER JOIN A ON B.attributeId = A.ID 
INNER JOIN C ON B.attributeId = C.attributeId 
WHERE B.fooId = 25 
    AND C.attributeId = -1 
ORDER BY C.DisplayIndex 
+0

OP明確表示「完全忽略A」,因爲在這種情況下,*不會成爲相應的表A記錄。 –