假设我有这样的数据库设计:
获取数据:
id | title | category
1 | first title | 1
2 | second title | 4
3 | third title | 5
4 | fourth title | 2
5 | fifth title | 3
6 | other title | 1
以及类别:
id | name
1 | music
2 | movies
3 | funny
4 | people
5 | sport
如何输出包含该类别项目标题的每个类别的列表?
有些想法:
<div>
<h1>music</h1>
<div>first title</div>
<div>other title</div>
<div>
<div>
<h1>movies</h1>
<div>fourth title</div>
<div>
// and so on...
我不知道如何为这样的结果制定mysql查询...
有人可以告诉我吗? (我希望这个例子可以很容易理解)
提前致谢。
修改: 我使用了Eugen Rieck的代码,但我不知道如何做以下事情
我如何在categories.id
和titles.id
同时订购,最终在那之后使用where条件?
类似这样的事:ORDER BY titles.id DESC LIMIT 0, 10 WHERE titles.views > 10
答案 0 :(得分:2)
假设您的第一个表名为titles
,而您的第二个表名为categories
,请使用类似
SELECT categories.name as cat, tiltes.title as title
FROM categories INNER JOIN titles ON titles.category=categories.id
ORDER BY categories.id
然后进行组更改循环
define('MAX_TITLES_PER_CAT',10);
$cat='';
$tcount=0;
while (true) {
//Fetch a row depending on your DB framework, eg. mysql_fetch_row()
if ($row['cat']!=$cat) {
if ($cat!='') echo '</div>';
$cat=$row['cat'];
$tcount=MAX_TITLES_PER_CAT;
echo "<div><h1>$cat</h1>";
}
if ($tcount--<=0) continue;
echo '<div>'.$row['title'].'</div>';
}
if ($cat!='') echo '</div>';
修改强>
我更新了上述代码,将每个类别显示的标题数限制为MAX_TITLES_PER_CAT
- 请理解,如果每个类别的平均标题数远远高于MAX_TITLES_PER_CAT
,则效率非常低
答案 1 :(得分:1)
SELECT
t.title,
c.name
FROM
titles t
INNER JOIN categories c
ON c.id = t.category
ORDER BY
c.name
ASC
这将为您提供按类别排序的所有标题的列表。你在PHP中做的大致如下:
$prevCategory = null;
while(fetchRows)
{
$newCategory = $row['name'];
if($prevCategory != $newCategory)
{
echo '<ul>{category name}</ul>';
}
echo '<li>{title}</li>';
$prevCategory = {category name};
}
请注意,这是半伪代码。它不会关闭以前的UL,也不会根据您寻找的HTML格式。这应该可以帮助你。