最初,我需要构建一个查询从一个表中提取sites
,该表按最新article
的日期排序(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
通过 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
,则查询正在运行,但它不会为每个站点提供最新帖子。相反,结果将在之后分类,这不是我需要的东西(实际上我更喜欢在分组后以另一种方式订购)。
我阅读了几个非常相似的问题,但它们都与存储在单个表格中的数据相关,因此可以使用MAX
和MIN
函数。
我应该怎样做才能实现我的需要?
答案 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
感谢大家给我提示和正确的搜索方向!