最初,我需要构建一个查询,从一个按最新article
的日期排序的表中获取sites
(articles
放在单独的表中)。
我构建了以下查询:
SELECT *
FROM `sites`
INNER JOIN `articles` ON `articles`.`site_id` = `sites`.`id`
ORDER BY `articles`.`date` DESC
GROUP BY `sites`.`id`
我假设SELECT
和INNER JOIN
将获取所有帖子,并将站点关联到每一个帖子,而ORDER BY
将按发布日期降序排列结果,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
语句之前,则查询有效,但它不会为我提供每个站点的最新帖子。相反,结果将在分组后排序,这不是我需要的(实际上我更喜欢在分组后以另一种方式排序)。
我读过几个非常相似的问题,但它们都与存储在一个表中的数据有关,因此可以使用MAX
和MIN
函数。
我应该做些什么来实现我需要的东西?
您可以使用子查询/派生表/内联视图或自排除联接,例如:
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
原则是,您选择的网站没有文章日期大于任何其他文章日期。
将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语句中执行类似操作。按函数分组要求对所有字段进行分组。因此,不可能使用*。
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;
你能试试这个吗?
终于找到了解决方案。
首先,我将主查询从sites
表中的queering更改为articles
中的quering。接下来,我将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
感谢大家给我的提示和正确的搜索方向!