Php 获取要显示的标签

Php 获取要显示的标签,php,mysql,Php,Mysql,我有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

我有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']."

两件事。。。出于某种奇怪的原因,书架标签没有显示出来,但如果我删除查询中的所有其他部分,如书籍标签,它就会工作。此外,我只能在一个长列中显示(通过循环)。如何将其拆分为单独的目录,或者如果在一列中,如何在每组书籍中仅显示一次书架标签?

SQL只是一种(结构化)查询语言,而不是报告语言。当您使用PHP时,我假设您将输出HTML,因此您可以通过浮点数或表等创建列。为了进行分组,最简单的方法是将查询结果读入嵌套数组,以便外部数组键可以是书架标签,内部数组键可以是书籍标签,然后以嵌套循环输出数组。

1st:转义输入变量

第二:删除连接中的LEFT,如果从交叉表开始,leftjoin是无意义的(IMHO)

第三:使用GROUP_CONCAT返回一组标题字符串,以逗号分隔,每个书架1行

$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必须解析/管理标题列表才能填充页面

您可以根据需要更改分隔符(例如:|)

foreach($results as$row){
回显“

”$row['label']。“

\n”; //在标题中使用“|”作为比“,”更不常见的分隔符 $array_of_titles=分解(“|”),$row['titlelist']; foreach($标题数组作为$标题){ 回显“”$title.

\n”; } 回音“\n”; }

我假设$results是一个与查询的所有行关联的数组

您的代码易受SQL注入攻击。您真的应该使用,将变量作为参数传递到其中,而这些参数不会对SQL进行计算。如果您不知道我在说什么,或者不知道如何修复它,请阅读的故事。您的意思是
shelf.id
,还是
shelf.label
。只需要标签;)隐马尔可夫模型。。。我想我理解你的意思,虽然听起来这种数组操作比我的技能水平高一点。。。
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";
}