2014-05-23 108 views
0

好吧,PHP/MySQL的 - 按日期排序

所以我有一个表,各列,其中之一是,我使用了最新的条目的数据库,如排序日期列:SELECT * FROM foo ORDER BY date DESC LIMIT 0,25。这给了我最新的25个条目。

我想要什么,是组合在一起的所有一个日期的条目在HTML使得输出将是:

<li class="date">Date 1.2.2014</li> 
<li>Some Entry</li> 
<li>Some Entry</li> 
<li>Some Entry</li> 
<li>Some Entry</li> 
<li class="date">Date 1.1.2014</li> 
<li>Some Entry</li> 
<li>Some Entry</li> 

容器是无关紧要的,他们可以<li><td>什么。

我想知道我是否可以在MYSQL中通过某种查询来完成这项工作,或者我需要以这种方式获得结果的PHP逻辑。另外,它应该是可伸缩的,换句话说,如果我想要最新的50,100,1000条记录,则需要更改的所有内容都是查询中的LIMIT范围。输出将自动“解析”我猜测结果并在每次遇到新日期时添加日期标题。

谢谢,

+0

尽管在SQL中是可行的,但我认为这最好在应用程序级别处理 –

+1

如果你想这样做纯你是需要'GROUP BY'和'GROUP_CONCAT'的SQL。你不想要。 – dtech

+0

@dtech groupConcat会有更好的表现吗?或者我会失去额外的PHP处理的任何优势? –

回答

2

只是跟踪日期。如果更改,则输出新的日期。

// The current date. Start with nothing. 
$currentDate = ''; 
// Loop through your db results 
while ($row = mysql_fetch_assoc($result)) { 
    // Check to see if the date of the current row is the same as previous row. 
    if ($currentDate !== $row['yourDateCol']) { 
     // echo out date 
     echo '<li class="date">'.$row['yourDateCol'].'</li>'; 
     // save the current date in $currentDate to cehck in next loop iteration 
     $currentDate = $row['yourDateCol']; 
    } 
    // echo out event details 
    echo '<li>'.$row['yourEventCol'].'</li>'; 
} 
+0

这是一个很好的答案,但它假定日期列只存储日期,月份和年份,如果不是'$ row ['curDateCol']'必须转换为所需的日期字符串。 – Victory

+0

正确。这只是解决了他们的算法问题。他们仍然需要以他们希望的方式格式化日期。由于他们没有表达任何问题,我没有说明。 –

+0

@JohnConde谢谢。我将使用这个解决方案,尽管使用foreach是因为我正在处理对象数组。但它的作品!另外,我可能会在未来尝试groupConcat。 –

0

记得的最后日期

$cur = null; 
while($row = mysql_fetch_assoc($r)) { 
    if($row['date'] !== $cur) { 
     $cur = $row['date']; 
     echo "<li class="date">" . $row['date'] . "</li>\n"; 
    } 
    echo "\t<li>" . $row['event'] . "</li>\n"; 
} 

还是与小组CONCAT做更多的SQL:

// SELECT date, GROUP_CONCAT(event SEPARATOR '</li><li>') AS entries FROM foo ORDER BY date DESC GROUP BY date LIMIT 25 
while($row = mysql_fetch_assoc($r)) { 
    echo "<li class="date">" . $row['date'] . "</li><li>" . $row['entries'] . "</li>"; 
} 

注意entries将被截断为1024个字符,所以如果你是不合适的每个日期都有很多事件。我也建议不要这样做。

0

您可以在本查询通过一组CONCAT做到这一点(虽然这将一般工作像标识的事情做得更好:

select yourDateField, groupConcat(id) 
from someTable order by yourDateField desc limit 0,25 

然后将返回如数据:

2014-05-22 
1, 2, 3, 4, 5 

对于每一行,你可以很容易地在foreach语句中爆炸

+0

该函数是“GROUP_CONCAT”的权利?我不认为PHP会通过CSV字符串进行foreach。 – dtech

+0

@dtech不,但是,您可以将分隔符放入,您可以轻松将其分解为数组。 – Fluffeh

+0

所以你让MySQL将一个列表折叠成一个字符串,然后让PHP将一个字符串展开成一个列表。似乎不是正确的行动方针。 – dtech