Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.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 选择最大组数_Mysql_Group By - Fatal编程技术网

Mysql 选择最大组数

Mysql 选择最大组数,mysql,group-by,Mysql,Group By,我们有一个如下表,其中包含订单状态: history --------------------------------- order_id status date 25 1 2014-10-01 25 3 2014-10-02 26 1 2014-10-01 27 2 2014-10-01 26 4 2014-10-

我们有一个如下表,其中包含订单状态:

history
---------------------------------
order_id    status    date
  25         1        2014-10-01
  25         3        2014-10-02
  26         1        2014-10-01
  27         2        2014-10-01
  26         4        2014-10-03
我需要选择具有指定状态的列的order_id,但它必须是最新状态。 通过功能分组,这是可能的:

SELECT status, order_id, MAX(date) 
FROM history GROUP BY order_id HAVING status = 4 OR status = 2
但这不适合我,因为我只需要order_id,因为这是子查询SELECT的一部分。。。其中[上述查询]中的订单id。然而,MySQL不允许这样做。 有没有其他方法可以解决这个问题?

使用自连接

SELECT h1.`order_id` FROM `history` h1
LEFT JOIN `history` h2 
ON (h1.`order_id`= h2.`order_id` AND h1.`status` > h2.`status`)
-- WHERE h1.status IN (1,2,3) < -- here you can use your status condition
GROUP BY h1.`order_id`

这个问题是标准groupwise max问题的一个变体,在这里和其他地方都有广泛的讨论,甚至在mysql手册中有专门的章节

对标准问题的标准响应是使用不相关的子查询,如下所示

SELECT x.* 
  FROM history x 
  JOIN  
     ( SELECT order_id, MAX(date) max_date FROM history GROUP BY order_id ) y 
    ON y.order_id = x.order_id 
   AND y.max_date = x.date;
由于附加要求,您的问题似乎更加复杂。然而,这是一种转移注意力的做法。使用这种方法的正确答案如下

SELECT x.* 
  FROM history x 
  JOIN  
     ( SELECT order_id, MAX(date) max_date FROM history GROUP BY order_id ) y 
    ON y.order_id = x.order_id 
   AND y.max_date = x.date 
 WHERE status IN (2,4);

关于GROUP BYstatus和use,如果最近的一个将有更大的自动增量id列,那么您可以使用这个逻辑,因为这个问题每天都会被询问并正确回答。仅有一个的白天因此,我觉得有点令人沮丧的是,a需要再次询问,b如此多的受访者能够提供错误的答案。我觉得在这方面有改进机制的余地,所以问题最初不清楚,后来用户在一个答案下的评论中澄清了。每个人都通过他们的想法和感知来回答。如果这是错误的,那么否定的评分就是存在的。我投了反对票。您的解决方案有缺陷,因此将返回不可预测和错误的结果。除了一个“hack”例外,在没有任何聚合函数的情况下使用groupby时总是这样。请参阅我上面的评论-尽管您提供的不同RDBMS的参考也解释了这一点@草莓我已经检查了这个解决方案在我这方面的工作非常好,OP想要一个单一的选择,这是我提出的唯一的解决方案。告诉我确切的问题是什么?你运行过这个吗?你引用的参考资料提供了合理的解释。但是把它放在一边,你只选择一列,然后按该列分组,那会有什么用处呢?OP需要订单id、状态和日期!!我理解OP在这方面没有很好地表达自己,但从他们的查询中可以清楚地看出,他们想要所有的列。逻辑也规定了这一点。否则,查询也可以从历史中选择不同的order_id,其中状态为2,4@Strawberry你没有把注意力集中在他问的问题上。DISTINCT将返回第一行,而OP希望第二行具有最新状态。请用我的问题来测试你自己。排爆药