mysql组,只从每个组中选择第一个

eufgjt7s  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(419)

这个问题在这里已经有答案了

sql仅选择列上具有最大值的行[重复](27个答案)
两年前关门了。
我想执行一个查询,只从给定的组中选择最近的项。
在这个例子中,我跟踪货车:
每次他们回到基地 check-in 记录信息-里程等。。。
每次他们送货时 delivery 已记录-客户等。。。
这张表让我们知道一个给定的历史 van . 数据可以通过查询生成,也可以在运行时存储—这不是问题所在。

id | checkin_id | delivery_id | van_id
----+------------+-------------+--------
 24 | 15         | NULL        | 3
 25 | NULL       | 28          | 3
 26 | 16         | NULL        | 4
 27 | NULL       | 29          | 3
 28 | NULL       | 30          | 4
 29 | 17         | NULL        | 5

我可以通过查询查看货车的历史 ... WHERE van_id=3; -好吧。
相反,我希望能够得到 vans 他们最近的“事件”。因此:

id | checkin_id | delivery_id | van_id
----+------------+-------------+--------
 27 | NULL       | 29          | 3
 28 | NULL       | 30          | 4
 29 | 17         | NULL        | 5

我跳转到以下问题:

SELECT * FROM `history` GROUP BY `van_id`;

但这会返回以下错误:

1055-select list的表达式#1不在group by子句中,并且包含未聚合的列“database.history.checkin_id”,该列在功能上不依赖于group by子句中的列;这与sql\u mode=only\u full\u group by不兼容

读完之后,我明白了这是怎么回事,不得不承认我的sql有些过时了—我想从组中返回哪些项?
添加 checkin_id 以及 delivery_idGROUP BY 只是转移了问题-最终我得到了相同的数据集,只是排序不同。
这个答案激起了我的兴趣,图片确实有助于清晰地勾勒出问题的轮廓,谢谢@azerafati!
我想使用 FIRST() 或者 LAST() 聚合函数-但mysql似乎没有。
如何在不处理应用程序中所有数据的情况下重现这种行为?

gz5pxeao

gz5pxeao1#

我猜你的 id 值是唯一的,以后的记录比以前的记录具有更高的值。
您需要使用一个子查询来获取最新的 id 对于每辆货车:

SELECT MAX(id) id, van_id
           FROM history
          GROUP BY van_id

然后将其加入到详细信息查询中。

SELECT h.*
   FROM history h
   JOIN (
         SELECT MAX(id) id, van_id
           FROM history
          GROUP BY van_id
        ) m ON h.id = m.id AND h.van_id = m.van_id

但是因为id值是唯一的,所以可以进一步简化。

SELECT h.*
   FROM history h
   JOIN (
         SELECT MAX(id) id
           FROM history
          GROUP BY van_id
        ) m ON h.id = m.id
ubbxdtey

ubbxdtey2#

我本来打算把这个标记为重复的,因为这个问题实际上被问得相当频繁,但我发现那些问题/答案似乎很难找到;下面是通用模板:

SELECT t.*
FROM theTable AS t
INNER JOIN (
   SELECT groupingValue, MIN(someValue) AS lowestValue
   FROM theTable
   GROUP BY groupingValue
) AS rIdent ON rIdent.groupingValue = t.groupingValue AND rIdent.lowestValue= t.someValue

在你的特殊情况下最低是最小(id)…哦,哎呀;你的问题说的是第一个,但细节说的是最近的(我将解释为最后一个),所以只需使用max而不是min…“groupingvalue”是vanïid。
编辑:如果在分组字段和用于标识最低/第一/最高/最近字段的字段上有索引,则查询应该相当有效。

相关问题