2016-01-20 73 views
0

我有一个查询从数据库返回帖子,查询按类别对帖子进行分组,并且标题是指向原始帖子的链接。返回的帖子显示在类别页面上。如何创建原始帖子的链接,PHP

问题是,虽然帖子标题按类别显示和分组,但我发现只找到每个帖子每个帖子的第一个post_id,并且只有每个类别中具有最低ID的第一个帖子或帖子由我的链接返回。该链接将您带到原始帖子。 原始讯息被显示在被称为“entries.php”

例页上:

POST1 ID = 1

POST2 ID = 2

Post3 ID = 3

以上所有帖子都按类别分组,但如果我将鼠标悬停在它们上面,则由于某种原因,它们都会取代Post1 id = 1。有什么我可以做的,以确保当我将鼠标悬停在他们上面时找到每个ID? 感谢您的时间!

查询:

$query = "SELECT category, GROUP_CONCAT(DISTINCT title SEPARATOR '<br />') titles, post_id 
     FROM categories, posts 
     WHERE categories.category_id = posts.category_id 
     GROUP BY category"; 

     $result = mysqli_query($dbc, $query) 
      or die('Error querying database.'); 

     while ($row = mysqli_fetch_array($result)){ 
      echo "<h2>".$row['category']."</h2>"; 
      echo '<a href="entries.php?id='.$row['post_id'].'">'.$row['titles'].'</a>'; 
      echo "<hr />"; 
     } 
+0

您的查询似乎缺少'的'GROUP BY'部分post_id'。 – aaaaaa123456789

回答

0

你应该GROUP BY POST_ID,还可以使用ORDER BY哟排序为你哗哗。

0

你在误解SQL的GROUPing概念。如果您在category_id上对GROUP行进行GROUP组化,您实际上告诉MySQL:无论存在多少行,我都希望每个category_id都有一行。在标准SQL中,只有在使用“GROUP BY category_id”时才允许“SELECT category_id”(以及聚合函数,如COUNT,MAX,MIN等)。 MySQL允许你多一点,随意选择一个命中(它找到的第一个命中)。

你可能想要的是ORDER BY CATEGORY_ID,然后做分组在你的PHP脚本像

$prev_cat_id = null; 
while ($row = mysqli_fetch_array($result)) { 
    if ($prev_cat_id != $row['category_id']) { 
     do stuff for next category 
    } else { 
     do stuff for next post in same category 
    } 
} 
remember to do cleanup for last category