2010-12-16 26 views
0

好的,我遇到了這種情況。 3個表格,標籤,書本和交叉表*。你如何處理這一點?使用JOIN的標籤

tags 
    -id int 
    -name varchar 

books 
    -id int 
    -name varchar 

taggings 
    -tagId_fk int 
    -bookId_fk int 

的樣本數據

 
tags 
    id name 
    1 good 
    2 really good 
    3 bad 
    4 long 
    5 exciting 

books 
    id  name 
    1  Pumpkin Man 
    2  O-castic Bastard 

taggings 
    bookId_fk  tagId_fk 
    1    1 
    1    4 
    2    4 
    2    5 

所以這裏南瓜人已被標記爲goodlongO型castic庶子已被標記爲longexciting

我想寫檢索單個查詢:不正是我想要

 

SELECT DISTINCT taggings.bookId_fk, tags.name FROM tags 
    INNER JOIN taggings ON taggings.tagId_fk=tags.tagId 
    ORDER BY taggings.bookId_fk; 

這個問題我真的是

 
books.id books.name  taggings.tagId_fk as tags.name (know what I mean?) 
1   Pumpkin Man  good 
1   Pumpkin Man  long 
2   O-castic Bastard long 
2   O-castic Bastard exciting 

,它甚至有可能顯示上述結果MySQL無:

  • 將其分解爲多個查詢,
  • 根本就使用子查詢?

* PS我知道some people don't use an intersection table

回答

2
SELECT b.*, 
      t.name 
     FROM books b 
INNER JOIN taggings t_b ON t_b.bookId_fk = b.id 
INNER JOIN tags t ON t.id = t_b.tagId_fk 
    ORDER BY b.id 

所以,是的,這是可能的。

注意:如果你有沒有書在所有的標籤 - 在這兩種情況下更改INNERLEFT,你會得到NULL值,而不是標籤的本本。