Я новичок в MySQL, а также PHP, и у меня было только несколько вопросов.
В настоящее время я пытаюсь создать архивное меню для моих сообщений, которые ищутся в моей базе данных MySQL с именем «posts».
Это должно выглядеть так,
2010 (2)
September (2)
Bellavisa
Mists of Netting
July (1)
Turkey is cool!
2009 (1)
May (1)
Cock of the Rock
но я сейчас получаю,
2010 (2)
September (2)
BellavisaJuly (1)
Turkey is cool!
2009 (1)
May (1)
Cock of the Rock
Значит, мне не хватает второго поста заголовка под сентябрь
Любая помощь будет оценена! Мой код ниже!
$sql = "SELECT Month(time) as Month, Year(time) as Year,
title, COUNT(*) AS total FROM posts GROUP BY Year, Month ORDER BY time DESC";
$stmt = $conn->query($sql);
$currentMonth = 0;
$currentYear = 0;
if ($stmt->num_rows > 0) {
while($row = $stmt->fetch_assoc()){
$title = $row["title"];
// if the year changes you have to display another year
if($row['Year'] != $currentYear) {
// reinitialize current month
$currentMonth = 0;
// display the current year
#echo "<li class=\"cl-year\">{$row['Year']} ({$row['total']})</li>";
echo " <ul>";
echo " <li onClick = 'show(\"{$row['Year']}\")' > <img src='images/triangle_closed.gif' id=img_{$row['Year']}>{$row['Year']} ({$row['total']})</li>\n";
echo " <li>\n";
echo " <ul id = {$row['Year']} style='display:none;'>\n";
#echo "</ul>";// change the current year
$currentYear = $row['Year'];
}
// if the month changes you have to display another month
if($row['Month'] != $currentMonth) {
// display the current month
$monthName = date("F", mktime(0, 0, 0, $row['Month'], 10));
#echo "<ul>";
echo " <li onClick = 'show(\"{$row['Year']}$monthName\")' > <img src='images/triangle_closed.gif' id=img_{$row['Year']}$monthName>$monthName ({$row['total']})</li>\n";
echo " <li>\n";
echo " <ul id = {$row['Year']}$monthName style='display:none;'>\n";
echo " <li class='cl-posts active'><a href='\base\item.php?id=$title'>".$title."</a></li>\n";
echo " </ul>\n";
echo " </li>\n";
#echo "<li class=\"cl-month\">$monthName ({$row['total']})</li>";
// change the current month
$currentMonth = $row['Month'];
}
// display posts within the current month
#echo "<li class='cl-posts active'><a href='\base\item.php?id=$title'>".$title."</a></li>";
}
}
$conn->close();
?>
Благодарю вас!
Глядя на ваш запрос, вы группируете по годам, поэтому обычно не отображается второй заголовок, а также вы пытаетесь подсчитать количество лет. Я бы предложил смешать подзапрос, чтобы вы могли получить оба результата, поэтому измените
SELECT Month(time) as Month, Year(time) as Year, title, COUNT(*) AS total FROM posts GROUP BY Year, Month ORDER BY time DESC
в
SELECT Month, Year, p.title, t.total
FROM posts p
INNER JOIN (SELECT DISTINCT Year(time) Year, Month(time) Month, SUM(1) FROM posts GROUP BY Year, Month) t ON t.Year = Year(p.time) AND t.Month = Month(p.time)
ORDER BY time DESC
Кроме того, для проблемы идентификации вы открываете новое перед закрытием последнего, каждый раз, когда изменяется год или месяц.
Проверьте для $ currentYear и $ currentMonth, если они отличны от нуля, вы должны закрыть перед открытием нового.
Других решений пока нет …