2012-03-01 87 views
0

我有2个表格,我必须从日期得到最后10个活动项目ID。查询是:MySQL group by after union#1064 error

(
SELECT project_posts.projectid as projectId, `project_posts`.`date` as rowDate 
FROM `project_posts` ORDER BY `project_posts`.id DESC 
) 
UNION ALL 
(SELECT `project_comments`.projectid as projectId, project_comments.`date` as rowDate FROM `project_comments` ORDER BY `project_comments`.id DESC) GROUP BY projectId ORDER BY rowDate DESC LIMIT 10 

而我想通过rowDate DESC(最后项目第一)对它排序。问题是,当我被MySQL添加组说:

 
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use 
near 'GROUP BY projectId ORDER BY rowDate DESC LIMIT 6' at line 9 

我看着在互联网上与工会,工会都和group by的问题,但我没有找到任何解决方案。 在此先感谢。

回答

4

我认为你需要,才能在IT团队从联合查询创建派生表 - 我还没有机会后,试试这个,但它应该做的你是什么

SELECT projectId, MAX(rowDate) AS rowDate 
FROM (
    (
     SELECT project_posts.projectid as projectId, `project_posts`.`date` as rowDate 
     FROM `project_posts` 
    ) UNION ALL (
     SELECT `project_comments`.projectid as projectId, project_comments.`date` as rowDate 
     FROM `project_comments` 
    ) 
) AS tmp 
GROUP BY projectId 
ORDER BY rowDate DESC 
LIMIT 10 

-

SELECT p.id, GREATEST(IFNULL(MAX(pc.date), 0), IFNULL(MAX(pp.date), 0)) AS max_date 
FROM projects p 
LEFT JOIN project_comments pc 
    ON p.id = pc.projectid 
LEFT JOIN project_posts pp 
    ON p.id = pp.projectid 
GROUP BY p.id 
ORDER BY max_date DESC 
LIMIT 10 

UPDATE的UNION基于查询应该比这个第二查询显著快。我已经使用一些虚拟数据(10万个项目,20万个帖子和700万条评论)做了一些粗略的测试,并且多联接查询比UNION查询长3到5倍。

+0

非常感谢您的快速回复。现在查询运行,但排序不正确,我没有拿到最后的项目ID(当我为日期DESC排序的两个塔布运行单独的select时,它们是不同的)。我尝试用ORDER BY'project_comments'.'date' DESC和'project_posts'.'date' DESC来更改每个select(在UNION中)的ORDER BY子句,但它仍然存在。任何建议?提前致谢。 – some12die4 2012-03-01 21:04:00

+0

我刚刚阅读您的原始文章。到底什么是最终目标和什么是表结构?我不认为用UNION进行查询是最好的方法。 – nnichols 2012-03-01 21:26:50

+0

对不起,误会。我想根据他们的活动(帖子和评论)获取最近10个活动项目。我没有找到与工会不同的方式。 – some12die4 2012-03-01 21:40:10