簡體   English   中英

如何使用mysql從多個類別中選擇行並顯示每個類別的數據列表?

[英]How to use mysql select rows from multiple categories and display a list with data for each category?

假設我有這樣的數據庫設計:

對於數據:

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

假設您的第一個表稱為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高得多,這效率很低。

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格式。 這應該可以幫助您。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM