Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql `在具有内部联接的请求中,ORDER BY`before`GROUP BY`?_Mysql_Join_Group By_Sql Order By_Inner Join - Fatal编程技术网

Mysql `在具有内部联接的请求中,ORDER BY`before`GROUP BY`?

Mysql `在具有内部联接的请求中,ORDER BY`before`GROUP BY`?,mysql,join,group-by,sql-order-by,inner-join,Mysql,Join,Group By,Sql Order By,Inner Join,最初,我需要构建一个查询,从一个表中获取站点,该表按放置在单独表中的最新文章的日期排序 我构建以下查询: SELECT * FROM `sites` INNER JOIN `articles` ON `articles`.`site_id` = `sites`.`id` ORDER BY `articles`.`date` DESC GROUP BY `sites`.`id` 我假设SELECT和INTERNAR JOIN将获取所有帖子并将一个站点与每个帖子相关联,而ORDER BY将按发布日

最初,我需要构建一个查询,从一个表中获取站点,该表按放置在单独表中的最新文章的日期排序

我构建以下查询:

SELECT *
FROM `sites`
INNER JOIN `articles` ON `articles`.`site_id` = `sites`.`id`
ORDER BY `articles`.`date` DESC
GROUP BY `sites`.`id`
我假设SELECT和INTERNAR JOIN将获取所有帖子并将一个站点与每个帖子相关联,而ORDER BY将按发布日期降序排序结果,而GROUP BY将获取每个站点的第一篇帖子,我将获得所需的结果

但是我收到了MySQL错误1064——您的SQL语法有错误;查看与MySQL服务器版本对应的手册,以了解第7行“groupbysites.idLIMIT 0,30”附近使用的正确语法

如果我把GROUPBY放在ORDERBY语句之前,查询是有效的,但它不会给我每个站点的最新帖子。相反,结果将在分组后排序,这不是我需要的东西,实际上我更喜欢在分组后以另一种方式排序

我读过几个非常相似的问题,但它们都与存储在一个表中的数据有关,这使得使用MAX和MIN函数成为可能


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

将sql重写为以下语法-

选择“文章”、“文章名称”、“站点”、“id”、“文章”、“站点id” 来自“站点”,“文章” 其中`articles`.`site\u id`=`sites`.`id`
按“站点”“id”“文章”“日期”“描述”排序 您可以使用子查询/派生表/内联视图或自排除联接,例如:

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
原则是,您选择的站点没有文章日期大于任何其他文章日期的站点

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;

你能试试这个吗?

我终于找到了解决办法

首先,我将主查询从queering from sites表更改为queering from articles。接下来,我将MAXdate列添加到结果中

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

  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

谢谢你们给我的提示和正确的搜索方向

您正在从站点选择行并按文章筛选结果。是否缺少某些内容?1054-where子句中的未知列“articles.site_id”,MySQL应该不知道articles表是什么。请从两个表中选择必填字段,而不是给出*。然后对从sites.id开始的所有字段执行分组操作。试试看。我目前在这里没有mysql,所以不能在这里尝试。@DileepKK您可以编辑您的原始答案,以便更清楚地说明从这两个表中选择是什么意思吗。我想这是一个错误的方法。我不能100%确定,但我真的相信这是一个错误的方法,因为你将两个表相乘。如果我有1000个站点和100万篇文章,那么在应用WHERE子句之前会有100万行。对不起,这个查询对我来说太复杂了:我最好使用一个我能理解的查询。它不会给出与“last_article_date”对齐的其他列