INNER JOIN请求中`GROUP BY`之前的`ORDER BY`?

时间:2014-10-28 16:46:54

标签: mysql join group-by sql-order-by inner-join

最初,我需要构建一个查询从一个表中提取sites,该表按最新article的日期排序(articles放在单独的表中。)

我构建了以下查询:

SELECT *
FROM `sites`
INNER JOIN `articles` ON `articles`.`site_id` = `sites`.`id`
ORDER BY `articles`.`date` DESC
GROUP BY `sites`.`id`

我认为SELECTINNER JOIN将获取所有帖子并将网站与每个网站相关联,而不是ORDER BY通过 post 日期的降序排序结果,而不是GROUP BY将为每个网站收到第一篇帖子,我将获得所需的结果。

但我收到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网站. id LIMIT 0, 30' at line 7

如果我在 GROUP BY语句之前放置ORDER BY ,则查询正在运行,但它不会为每个站点提供最新帖子。相反,结果将在之后分类,这不是我需要的东西(实际上我更喜欢在分组后以另一种方式订购)。

我阅读了几个非常相似的问题,但它们都与存储在单个表格中的数据相关,因此可以使用MAXMIN函数。

我应该怎样做才能实现我的需要?

4 个答案:

答案 0 :(得分:1)

您可以使用子查询/派生表/内联视图或自我排除连接,例如:

SELECT s.*, a1.*
FROM `sites` s
    INNER JOIN `articles` a1 ON a1.`site_id` = s.`id`
    LEFT OUTER JOIN `articles` a2 ON a2.`site_id` = a1.`site_id`
        AND a2.`date` > a1.`date`
WHERE 
    a2.`site_id` IS NULL
ORDER BY 
    a1.`date` DESC

原则是您选择没有文章日期大于任何其他文章日期的网站。

答案 1 :(得分:0)

将sql重写为以下语法 -

SELECT `articles`.`article_name`,'sites'.'id','articles'.'site_id'
FROM `sites`,'articles'
WHERE `articles`.`site_id` = `sites`.`id`
ORDER BY 'sites'.'id', `articles`.`date` DESC;

在select语句中执行类似的操作。按功能分组要求将所有字段分组。因此无法使用*。

答案 2 :(得分:0)

SELECT * FROM (  SELECT `S.<col1>`, `S.<col2>`, `A.<col1>`,`A.<col2>`,
                           ROW_NUMBER ()
                           OVER (PARTITION BY `SITES`.`ID`
                                 ORDER BY `SITES`.`ID` DESC)
                              RID
                      FROM `SITES` `S`,`ARTICLES` `A`
                      WHERE `ARTICLES`.`SITE_ID` = `SITES`.`ID`
                  )
           WHERE RID = 1;

你能试试吗?

答案 3 :(得分:0)

最后我找到了解决方案。

首先,我将主查询从sites表的队列更改为articles的队列。接下来,我将MAX(date)列添加到结果中。

因此,实现我需要的结果的查询如下:

  SELECT `sites`.`url`,MAX(`articles`.`date`) AS `last_article_date`
  FROM `articles`
  INNER JOIN `sites` ON `sites`.`id` = `article`.`site_id`
  GROUP BY `site_id`
  ORDER BY `last_article_date` ASC

感谢大家给我提示和正确的搜索方向!