如何使用mysql从多个类别中选择行并显示包含每个类别数据的列表?

时间:2012-06-21 11:49:38

标签: php mysql

假设我有这样的数据库设计:

获取数据:

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.idtitles.id同时订购,最终在那之后使用where条件?

类似这样的事:ORDER BY titles.id DESC LIMIT 0, 10 WHERE titles.views > 10

2 个答案:

答案 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格式。这应该可以帮助你。