2013-03-21 2 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 из наиболее recente статьи категории НО ТОЛЬКО ЕСЛИ СТАТЬЯ статусных 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

ответ

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 statements либо PDO , либо MySQLi. Вот хороший PDO tutorial.

+0

Отлично! Оно работает. Еще одна вещь. У меня есть некоторые категории, которые еще не содержат статей, но я бы тоже хотел их перечислить. Это возможно? Я не хочу тебя беспокоить. Если вы не ответите мне, я пойму. Благодарю. –

+0

Конечно, это возможно, и это так же просто, как изменение 'LEFT' присоединения к' RIGHT', или мы могли бы переписать его с помощью таблиц замены LEFT'. См. Обновленный ответ и sqlfiddle. – peterm

+0

Теперь его идеальный, peterm! Большое спасибо за помощь. –

Смежные вопросы