mysql—是否可以使用GROUPBY子句指定查询结果中表示组的行的选择?

vxqlmq5t  于 2021-06-23  发布在  Mysql
关注(0)|答案(3)|浏览(218)

以下查询,

select shelf_id, issue_date, current_qty
from Stock
where barcode = '555' and issue_date <= '2018-05-30 14:28:32'

将得到以下结果,

10  2018-05-25 00:00:00 5
10  2018-05-28 00:00:00 55
5   2018-05-29 00:00:00 100

添加 group by shelf_id 会导致这样的结果,

10  2018-05-25 00:00:00 5
5   2018-05-29 00:00:00 100

预期结果如下。

10  2018-05-28 00:00:00 55
5   2018-05-29 00:00:00 100

这背后的原因是,对于每个组,我想返回组中最新的一行 issue_date . limit 1 将所有的组限制为一组, having issue_date... 将是一个可能的解决方案,但我不知道如何获得最接近的日期最大(问题\日期)
不使用子查询就可以完成这个任务吗?
编辑:
where子句中的第二个条件 issue_date <= '2018-05-30 14:28:32' 是用户输入 issue_date <= ?2 如果要最初筛选表,则查询应按每个shelf\u if的结果分组,但返回最接近max(issue\u date)日期的行。所以我不明白如何用子查询替换这个条件。

g9icjywg

g9icjywg1#

你可以这样试试

select ST.shelf_id, ST.issue_date, ST.current_qty
from Stock as ST INNER JOIN (select shelf_id, MAX(issue_date) AS issue_date
from Stock
where barcode = '555' and issue_date <= '2018-05-30 14:28:32'
GROUP BY shelf_id) AS A ON ST.shelf_id = A.shelf_id and ST.issue_date = A.issue_date

只要(货架标识,发行日期)是唯一的,这应该工作,请让我知道如果我错了

5jdjgkvh

5jdjgkvh2#

不要使用 group by ! 您正在尝试筛选行。这里有一种方法:

select s.*
from stock s
where s.issue_date = (select max(s2.issue_date) from stock s2 where s2.shelf_id = s.shelf_id);

作为奖励,加上指数 stock(shelf_id, issue_date) ,性能应该比 group by .

yyyllmsg

yyyllmsg3#

如果您有“标识”列,则可以使用 LIMIT 条款:

select s.*
from Stock s
where barcode = '555' and issue_date <= '2018-05-30 14:28:32' and 
      identity_col = (select identity_col
                      from Stock s1
                      where s1.shelf_id = s.shelf_id
                      order by s1.issue_date desc
                      limit 1
                     );

相关问题