2011-10-12 72 views
0

我有如下表MySQL查询帮助来获取数据合并两个表

articles_category

id title sef_title 

articles_data

id cat_id title sef_title details 

在每个表 “ID” 是主键articles_data.cat_id是articles_category的外键

我需要为每个文章类别提取以下数据的最新文章数据。

articles_category.id 
articles_category.title 
articles_category.sef_title 
articles_data.id 
articles_data.cat_id 
articles_data.title 
articles_data.sef_title 
articles_data.details 

我试着用下面的查询,但它显示的第一篇文章(最老的条目),而不是最新的一个。

SELECT 
    articles_category.id as article_cat_id, articles_category.sef_title as cat_sef_title, articles_category.title as cat_title, 
    articles_data.id, articles_data.cat_id as listing_cat_id, articles_data.title, articles_data.sef_title, articles_data.details 
FROM articles_category, articles_data 
WHERE articles_category.id = articles_data.cat_id 
GROUP BY articles_data.cat_id 
ORDER BY articles_data.id DESC 
+1

Mhhh ...日期在哪里? – Ivan

+0

@lvan该表没有任何日期字段,我需要排序的是每个类别的最后一篇文章 – Prakash

+0

您应该使用日期,从不信任ID。你不知道在现场后面做了什么SQL引擎:) – Ivan

回答

1

如果它是一个一对多的关系,尝试(未经测试):

SELECT * 
FROM articles_category, articles_data 
WHERE articles_category.id = articles_data.cat_id 
    AND articles_data.id in (
    SELECT max(articles_data.id) 
    FROM articles_data GROUP BY cat_id 
) 

你是不是在GROUP BY

保证特定的行,你真的应该使用日期上你的文章作为即使您正在使用自动增量,最大ID也不能保证是最新的文章

+0

这个查询似乎工作正常。我不确定你想告诉的是“即使你使用自动增量,最大ID也不能保证是最新的文章”。你能提供更多的信息吗? – Prakash

+0

人们总是可以在某个时刻删除某个文章(这不会是最新的) – smp7d

0

ORDER影响GROUP函数执行后的记录显示。 GROUP功能识别它在搜索中看到的第一条记录。

你需要做的是执行2个查询。第一个应该是

SELECT max(articles_data.id), articles_data.cat_id ... 
GROUP BY articles_data.cat_id 

第二查询应取使用这些所得主键相关联的记录。

+0

一个子查询将工作 – smp7d

+0

@ smp7d一个子查询肯定会工作。 –

+0

理论上...是的。但是,对于相关应用程序而言,速度可能太慢。 – smp7d

-1

可能性是创建另一个值,如date_created,并在创建条目时在其中放置时间戳。

然后你只需要ORDER BY日期。

+1

升序排序显示列表顶部的最小数字。你的答案不会改变他的输出。 –

+0

id在两个表上都是auto_increment。我尝试了'ORDER BY articles_data.id ASC'和'ORDER BY articles_data.id DESC',但它不起作用 – Prakash

+0

解决方案只是创建一个时间戳。知道什么时候创建是一件好事。 –