2012-05-13 103 views
2

對於一個實例,我們有這三個表中的一行:獲取基於其他兩個表

terms_relation

╔═════════╦═════════╗ 
║ post_id ║ term_id ║ 
╠═════════╬═════════╣ 
║  1 ║  1 ║ 
║  1 ║  2 ║ 
║  1 ║  3 ║ 
╚═════════╩═════════╝ 

terms_taxonomy

╔════╦═════════╦══════════╗ 
║ id ║ term_id ║ taxonomy ║ 
╠════╬═════════╬══════════╣ 
║ 1 ║  1 ║ categ ║ 
║ 2 ║  2 ║ categ ║ 
║ 3 ║  3 ║ tag  ║ 
║ 4 ║  3 ║ categ ║ 
║ 5 ║  4 ║ categ ║ 
║ 6 ║  5 ║ tag  ║ 
╚════╩═════════╩══════════╝ 

方面

╔════╦════════╦════════╗ 
║ id ║ name ║ slug ║ 
╠════╬════════╬════════╣ 
║ 1 ║ samsung║ samsung║ 
║ 2 ║ nokia ║ nokia ║ 
║ 3 ║ opera ║ opera ║ 
║ 4 ║ chrome ║ chrome ║ 
║ 5 ║ webkit ║ webkit ║ 
╚════╩════════╩════════╝ 

terms_relation.post_id = 1,我該如何選擇terms所有行具有在terms_taxonomycateg一個taxonomy基於term_id

所以它必須得到:samsungnokia(不是opera,因爲它是一個標籤)。

這是我目前的嘗試,可惜我不明白這有什麼錯我的查詢:

select terms.name from terms_taxonomy 
join terms_relation 
on terms_relation.post_id = 1 
join terms 
on terms_taxonomy.term_id = terms.id 
where taxonomy = "categ" 

上述查詢的不需要的輸出:

+---------+ 
| name | 
+---------+ 
| samsung | 
| nokia | 
| opera | 
| chrome | 
| samsung | 
| nokia | 
| opera | 
| chrome | 
| samsung | 
| nokia | 
| opera | 
| chrome | 
| samsung | 
| nokia | 
| opera | 
| chrome | 
| samsung | 
| nokia | 
| opera | 
| chrome | 
| samsung | 
| nokia | 
| opera | 
| chrome | 
+---------+ 

回答

1

你或許應該只是移動JOIN中的條件。此外,移動post_id條件的WHERE裏面似乎更符合邏輯:

SELECT t.name 
FROM terms_relation tr 
JOIN terms_taxonomy tt ON tr.term_id = tt.term_id AND tt.taxonomy = "categ" 
JOIN terms t ON tr.term_id = tt.id 
WHERE tr.post_id = 1 

編輯我又重讀你的問題,並不能真正弄明白的關係是如何定義的,我認爲這些連接條件:

  • terms_taxonomy.term_id = terms_relation.term_id
  • terms.id = terms_taxonomy.term_id
+0

是的,這三者是相關的,儘管它仍然是'歌劇'。 – Michelle

+0

@JackSpairow好的謝謝你的更新,我會重新檢查它。 –

+0

'terms.id = terms_taxonomy.term_id' – Michelle

0

這裏有一個版本沒有加入:

SELECT name FROM terms WHERE id IN 
(SELECT id FROM terms_taxonomy,terms_relation,terms 
WHERE terms_relation.post_id = 1 
AND terms_taxonomy.taxonomy = "categ" 
AND terms.id = terms_taxonomy.term_id); 
+0

輸出結果是:''三星,諾基亞,鉻,webkit' – Michelle

+0

編輯將term_taxonomy.term_id與term.id匹配,就像其他答案一樣。現在應該工作。 – keyser