gpt4 book ai didi

MySQL - 按非聚合列分组

转载 作者:行者123 更新时间:2023-11-29 06:50:01 25 4
gpt4 key购买 nike

如果我像这样存储用户的分数:

+---------+-------+------------+
| user_id | score | created_at |
+---------+-------+------------+
| 1 | 100 | 2017-12-20 |
| 1 | 200 | 2017-12-21 |
| 2 | 110 | 2017-12-20 |
| 2 | 210 | 2017-12-21 |
| 3 | 120 | 2017-12-20 |
| 3 | 220 | 2017-12-21 |
+---------+-------+------------+

在给定输入日期的情况下,我如何才能获得每个用户最接近的记录?

我已经做到了

SELECT *, (abs(datediff("$some-input-date",created_at))) as diff FROM 表顺序 by diff

这将为我提供输入日期2017-12-19:

+---------+-------+------------+------+
| user_id | score | created_at | diff |
+---------+-------+------------+------+
| 1 | 100 | 2017-12-20 | 1 |
| 2 | 110 | 2017-12-20 | 1 |
| 3 | 120 | 2017-12-20 | 1 |
| 1 | 200 | 2017-12-21 | 2 |
| 2 | 210 | 2017-12-21 | 2 |
| 3 | 220 | 2017-12-21 | 2 |
+---------+-------+------------+------+

现在我想要user_id的唯一行,所以我假设GROUP BY user_id之类的东西可以工作,但我得到一个“SELECT列表的表达式不在MySQL 5.7 中的 GROUP BY 子句”错误。在这种情况下如何按 user_id 进行分组?

(我也在使用 Doctrine ,因此如果有某种方法可以使用 dql 或 Doctrine 函数来实现此目的,那也很有用)

最佳答案

好的,现在您知道如何获取日期差异,并且您只需要特定用户的顶部结果,按日期差异升序排序:

SELECT * FROM
--your current query
(SELECT *, (abs(datediff("$some-input-date", created_at))) as diff FROM table) as data_with_diffs
INNER JOIN
( --a query to find only the minimum diffs per user id
SELECT userID, MIN(abs(datediff("$some-input-date", created_at))) as min_diff
FROM table
GROUP BY userid
) as find_min_diffs

ON
data_with_diffs.userid = find_min_diffs.userid AND
data_with_diffs.diff = find_min_diffs.min_diff

如果您单独运行两个内部查询,您将看到它是如何工作的。还有其他构建此结构的方法,但我认为这最适合您根据您理解/已经开发的内容了解整个事情如何结合在一起

分组查询仅选择特定用户 ID 的最小差异。通过将其作为子查询运行,并将其连接回您已生成的数据,INNER JOIN 将过滤掉差异不等于最小差异的所有行

如果用户的之前日期和之后日期具有相同的差异(即 -1 和 +1 - 这些都是最接近的),您可能仍然会得到重复的行,因此您可能必须实现一种策略来处理这样,就像选择他们的最高分数

关于MySQL - 按非聚合列分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47903247/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com