2013-03-21 80 views
0

我有一个articles表和categories表是这样的:如何获得每个类别中最最近的一篇文章日期

articles 
----------------------------------------------- 
| id | datetime | title | categoryid | status | 
----------------------------------------------- 

categories 
------------- 
| id | name | 
------------- 

我需要获得最新的文章从每个类别日期的选择,像:

result 
---------------------------------------------------------- 
| category id | category name | most recent article date | 
---------------------------------------------------------- 

结果必须包含每个类别的所有类别+最近的文章(状态= 0)日期。

它必须产生酷似select * from categories PLUS显示类别的最最近搜索文章的datetime但只有当文章状态为0新行。

这是明确的吗?

我需要的原因是因为我试图制作一个动态站点地图,而且我需要每个类别的最新文章的时间在<lastmod>标签上显示类别列表。

$sql = mysql_query(".....?......"); 

while ($string = mysql_fetch_array($sql)){?> 
    <url> 
     <loc>http://www.url.com/<?echo $string['id'];?>/<?echo generate_seo_link($string['name']);?>/</loc> 
     <priority>0.5</priority> 
     <changefreq>daily</changefreq> 
     <lastmod><? echo date("d/m/Y H:i:s", strtotime($string['date'])); ?></lastmod> 
    </url> 
<?} 
+1

你试过了什么SQL语句?可能重复:http://stackoverflow.com/questions/3869426/mysql-join-most-recent-matching-record-from-one-table-to-another – Jon 2013-03-21 01:40:31

回答

3

UPDATE2,以适应status

SELECT c.id, c.name, MAX(a.datetime) most_recent 
    FROM articles a RIGHT JOIN 
     categories c ON a.categoryid = c.id 
WHERE a.status IS NULL OR a.status = 0 
GROUP BY c.id, c.name 

输出

| ID |  NAME | RECENT_DT | 
------------------------------- 
| 1 | Category1 | 2013-03-19 | 
| 2 | Category2 | 2013-03-17 | 
| 3 | Category3 |  (null) | 

这里是SQLFiddle

而且在一个侧面说明

请不要将mysql_ *函数用于新代码。他们是 deprecated。使用prepared statementsPDOMySQLi。这是一个很好的PDO tutorial

+0

太棒了!有用。还有一件事。我有一些没有文章的类别,但我想列举它们。那可能吗?我不想打扰你。如果你不回答我,我会理解。谢谢。 – 2013-03-21 01:50:15

+0

当然这是可能的,并且像将“LEFT”连接更改为“RIGHT”一样简单,或者我们可以用“LEFT”连接交换表重写它。查看更新的答案和sqlfiddle。 – peterm 2013-03-21 01:55:58

+0

它的完美现在,peterm!非常感谢你的帮助。 – 2013-03-21 02:00:14

相关问题