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

几件事......由于某种奇怪的原因,货架标签没有出现,但如果我删除查询中的所有其他部分,比如书籍标签,它就可以工作。另外,我只能在一长列中显示(通过循环)。我如何将它分成单独的列,或者如果在一列中,我如何每组书籍只显示一次货架标签?

4

2 回答 2

0

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

于 2012-07-01T23:46:06.397 回答
0

第一:转义输入变量

第二:删除连接中的左,如果你从跨表左连接开始是胡说八道(恕我直言)

第三:使用 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){

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";
}

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

于 2012-07-01T23:47:44.443 回答