我有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']."
偶然的事情...由于一些奇怪的原因,货架标签没有显示,但如果我删除查询中的所有其他部分,如书籍标签,它的工作原理。此外,我只能在一个长列中显示(通过循环)。如何将其拆分为单独的库存,或者如果在一列中,如何在每组书籍中仅展示一次货架标签?
答案 0 :(得分:0)
SQL只是一种(结构化)查询语言,而不是报告语言。在您使用PHP时,我假设您要输出HTML,因此您可以通过以下方式创建列:花车或桌子。为了进行分组,最简单的方法是将查询结果读入嵌套数组,以便外部数组键可以是货架标签,内部数组键可以是书签,然后输出数组。嵌套循环。
答案 1 :(得分:0)
1st:转移输入变量
第二名:删除加入中的LEFT,如果从交叉表开始,leftjoin是无意义的(恕我直言)
3rd:使用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必须解析/管理titlelist以填充页面
ADD
您可以根据需要更改分隔符(例如:|)然后
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是一个包含查询所有行的关联数组。