2012-07-01 60 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