我试图让我的代码正确输出有点困难,见下文。一切正常,但不是显示所有新闻项目,而是每月只显示一个。我需要做的是将选定月份的所有新闻与该月的月/年标题分组。希望这是有道理的。
任何帮助非常感谢。 SS
$theQuery="Select * from isnews WHERE active = '1' GROUP BY YEAR(date) DESC, MONTH(date) ORDER BY YEAR(date) DESC, MONTH(date) DESC";
$newsQuery=mysql_query($theQuery);
if(mysql_num_rows($newsQuery)>0) {
while ($newsResult=mysql_fetch_array($newsQuery)) {
$newDate = $newsResult['date'] ;
echo '<div class="date">' . date('F Y ',strtotime($newDate)) . '</div>';
echo '<ul class="press">';
echo '<li>
<img src="'.$wwwUrl.'images/news/'.$newsResult['image'].'" width="'.$newsResult['tnWidth'].'" height="'.$newsResult['tnHeight'].'" title="'.$newsResult['title'].'" alt="'.$newsResult['title'].'" />
<h3><a href="press-releases/'.$newsResult["id"].'/'.$newsResult["title"].'.php">'.$newsResult["title"].'</a></h3>
'.substr($newsResult['descrip'],0,100).'
<p><a href="press-releases/'.$newsResult["id"].'/'.$newsResult["title"].'.php">Read more</a></p>
</li>';
}
echo '</ul>';
} else {
echo 'We currently have no press releases available';
}
答案 0 :(得分:2)
我可以看到两个问题。首先,GROUP BY
是一个聚合函数,因此它用于将多行组合成结果中的一行(例如,如果您想查看为给定月份和年份编写了多少新闻项) 。其次,即使您在每个时间段内获得多个记录,您也要为从数据库中提取的每条记录输出日期标题(例如,如果您有来自同一月份和年份的多个新闻项,则会获得重复的标题)。
更好的解决方案是收集所有活动新闻项(没有GROUP BY
子句),然后构建一个数组,然后您可以迭代输出页面:
$query = "SELECT *
FROM isnews
WHERE active = '1'
ORDER BY YEAR(date) DESC, MONTH(date) DESC";
$resultSet = mysql_query($query);
if (mysql_num_rows($resultSet))
{
$newsArray = array();
while ($newsResult = mysql_fetch_array($resultSet))
{
// The time period is what you will output as your header
$timePeriod = intval(date("F Y", $newsResult['date']));
if (!isset($newsArray[$timePeriod]))
{
// Create a subarray if needed
$newsArray[$timePeriod] = array();
}
$newsArray[$timePeriod][] = $newsResult;
}
foreach ($newsArray as $timePeriod => $newsItems)
{
echo '<div class="date">' . $timePeriod . '</div>';
echo '<ul class="press">';
foreach ($newsItems as $item)
{
echo '<li>';
// ... do your news item outputting
echo '</li>';
}
echo '</li>';
echo '</div>';
}
}
else
{
echo 'We currently have no press releases available';
}
答案 1 :(得分:1)
非常感谢你的帮助。
为了创建一个显示年份的侧边栏类型的存档列表,然后是月份及其相应的新闻结果,我尝试稍微调整Daniel的代码。最终结果是手风琴式菜单,其中年份下拉显示月份,然后是月份下拉显示新闻项目。到目前为止,我可以让它工作,但似乎无法让这几个月正常工作。
任何指针/帮助都非常感激。 (以下代码) SS
$query = "SELECT * FROM isnews WHERE active = '1' ORDER BY YEAR(date) DESC, MONTH(date) DESC";
$resultSet = mysql_query($query);
if (mysql_num_rows($resultSet))
{
$newsArray = array();
echo '<ul>' . PHP_EOL;
echo '<li><strong>Press releases:</strong></li>' . PHP_EOL;
while ($newsResult = mysql_fetch_array($resultSet))
{
$newDate = $newsResult['date'] ;
$timePeriod = date('F Y ',strtotime($newDate));
$timePeriodY = date('Y',strtotime($timePeriod));
$timePeriodM = date('F',strtotime($timePeriod));
if (!isset($newsArray[$timePeriodY]))
{
$newsArray[$timePeriodY] = array();
}
$newsArray[$timePeriodY][] = $newsResult;
}
foreach ($newsArray as $timePeriodY => $newsItems)
{
echo '<li><em>' . $timePeriodY . '</em>' . PHP_EOL;
echo '<ul>' . PHP_EOL;
foreach ($newsItems as $item)
{
echo '<li>';
echo '<a href="press-releases/'.$item["id"].'/'.$item["title"].'.php">'.$item["title"].'</a>';
echo '</li>' . PHP_EOL;
}
echo '</ul>' . PHP_EOL;
echo '</li>' . PHP_EOL;
}
echo '</ul>' . PHP_EOL;
}
else
{
echo 'We currently have no press releases available';
}
答案 2 :(得分:0)
每月仅显示一个
这是正确的,你的GROUP BY不正确。所有列(请参阅*)都应该在GROUP BY中,因为它们都在SELECT中,并且您不使用任何聚合函数。 MySQL有非常奇怪的行为,现在只返回它能找到的第一条记录。
如果您想要所有记录,只需删除整个GROUP BY和ORDER BY月份和年份即可获得正确的排序顺序。在你的PHP中你可以创建一些组,但这与SQL无关。
你可能会考虑ONLY_FULL_GROUP_BY,这有助于防止出现奇怪/错误的结果。