2012-07-01 66 views
0

我有3個MySQL表:獲取標籤顯示

shelf 
--------------- 
id 
project_id 
label 


books 
--------------- 
id 
project_id 
label 


booksOnShelves 
--------------- 
id 
shelf_id 
book_id 
project_id 
user_id 

我需要顯示是什麼書在什麼架子以表格形式,像:

History  Fiction 
-------  -------- 
book 1  book 4 
book 2  book 5 
book 3 

到目前爲止我只有這引起了:

SELECT 
     shelf.label, 
     books.label 
    FROM booksOnShelves 
    LEFT JOIN shelf ON (shelf.id = booksOnShelves.shelf_id) 
    LEFT JOIN books ON (books.id = booksOnShelves.book_id) 
    WHERE booksOnShelves.project_id = ".$_POST['pid']." 
    AND booksOnShelves.user_id = ".$_POST['uid']." 

夫婦的事情......對於一些奇怪的原因,貨架標籤沒有顯示出來,但如果我刪除所有其他部分查詢,L艾克書標籤,它的作品。另外,我只能在一個長列中顯示(通過循環)。我如何將它分解成單獨的庫侖,或者如果在一列中,每組書籍只能顯示一次貨架標籤?

+1

**你的代碼很容易受到SQL注入**你真的*應該使用[prepared statements](http://stackoverflow.com/a/60496/623041),將你的變量作爲參數傳遞給它不會針對SQL進行評估。如果你不知道我在說什麼,或者如何解決它,請閱讀[Bobby Tables]的故事(http://stackoverflow.com/questions/332365/xkcd-sql-injection-please-explain) 。 – eggyal

+0

您的意思是'shelf.id'還是'shelf.label'的拼寫錯誤? – Neil

+0

@尼爾良好的捕獲。只需要標籤;) – santa

回答

0

月1日:逃離輸入瓦爾

第二:刪除留在加入,如果您從交叉表leftjoin開始是廢話(恕我直言)

3:使用GROUP_CONCAT返回一組標題的字符串,逗號分隔,每架

$pid = mysql_real_escape_string($_POST['pid']); 
$uid = mysql_real_escape_string($_POST['uid']); 

$sql = "SELECT 
     shelf.label, 
     GROUP_CONCAT(books.label separator ',') as titlelist 
    FROM booksOnShelves 
    JOIN shelf ON (shelf.id = booksOnShelves.shelf_id) 
    JOIN books ON (books.id = booksOnShelves.book_id) 
    WHERE booksOnShelves.project_id = ".$pid." 
    AND booksOnShelves.user_id = ".$uid." 
group by booksOnShelves.shelf_id"; 

當然你的PHP必須分析/管理titlelist以填充頁面

ADD

1排

您可以更改分隔符爲你的需求(如:|),那麼

foreach($results as $row){ 

echo "<div class='float_left'><p class='bold'>".$row['label']."</p>\n"; 
// using '|' as separator less common then ',' in the titles 
$array_of_titles = explode('|',$row['titlelist']); 
foreach($array_of_titles as $title){ 
echo "<p>".$title."</p>\n"; 

} 
echo "</div>\n"; 
} 

我假設$結果是一個關聯數組與您的查詢的所有行。

+0

哇,這很酷。不太確定我會如何輸出。 – santa

0

SQL只是一種(結構化)查詢語言,而不是報告語言。正如你使用PHP,我假設你將輸出HTML,所以你可以通過例如創建列。花車或桌子。爲了進行分組,最簡單的方法是將查詢結果讀入嵌套數組,以便外部數組鍵可以是貨架標籤,內部數組鍵可以是書籤,然後將數組輸出到嵌套循環。

+0

嗯...我想我理解你的意思,雖然聽起來這種陣列操作有點高於我的技能水平... – santa