比较两个表中的分数并显示最近不同的分数
Compare scores in two tables and show those where the most recent is different
我在 MariaDB 中有两个 table,我需要在左侧显示那些 table,它们的当前分数与历史记录中的最新分数不同 table.
例如:
users
id name current_score
1 Bob 4
2 Tom 5
3 Fred 3
4 Tim 3
5 Ian 4
histories
id user_id score date
1 1 3 2018-11-13
2 1 4 2018-11-12
3 1 2 2018-11-11
4 2 5 2018-11-12
在上面,我想显示 Bob,因为他的最新历史记录与他当前的得分不同,但不显示 Tom,因为他是匹配项
我尝试使用类似的东西:
SELECT u.id, u.name, u.current_score
FROM users u
where u.current_score not in
(select h.score from histories h where
h.user_id=u.id order by h.date desc limit 1)
这引发了一个错误:
#1235 - This version of MariaDB doesn't yet support
'LIMIT & IN/ALL/ANY/SOME subquery'
如果我删除限制 1 那么它 return 用户中的几乎所有行 - 每个 table 中有几千行但我认为它应该 return大约 50,但它 return 在 4,285 行可能的行中超过 4,100 行
- 在
Select
子句本身内确定相关子查询中的最新历史分数。
Group By
在用户上,并使用 HAVING
子句来考虑当前分数与历史中最新分数不匹配的情况
- 我必须对分值使用
MAX()
聚合函数,这样它才符合有效的 ANSI SQL GROUP BY
。它不会影响任何东西,因为各自的分数值只有一个(因此只有最大值)。
请尝试以下操作:
SELECT u.id,
u.name,
MAX(u.current_score) AS m_current_score,
MAX((select h.score
from histories h
where h.user_id = u.id
order by h.date desc limit 1)) AS history_score
FROM users u
GROUP BY u.id, u.name
HAVING m_current_score <> history_score
您需要的一种方法是使用子查询获取与每个 user_id
的最新历史条目相关的 date
。在此之后,您可以再次加入 table histories
以获取与最新 date
关联的其余列。这是在下一个查询中总结的:
SELECT
u.id,
u.name,
u.current_score,
h.score AS latest_score_from_history
FROM
user AS u
LEFT JOIN
-- This subquery gets the date of the latest history register for every user
(SELECT
user_id,
MAX(date) AS maxDate
FROM
histories
GROUP BY
user_id) AS latest ON latest.user_id = u.id
LEFT JOIN
histories AS h ON h.user_id = latest.user_id AND h.date = latest.maxDate
WHERE
u.current_score <> h.score
我在 MariaDB 中有两个 table,我需要在左侧显示那些 table,它们的当前分数与历史记录中的最新分数不同 table.
例如:
users
id name current_score
1 Bob 4
2 Tom 5
3 Fred 3
4 Tim 3
5 Ian 4
histories
id user_id score date
1 1 3 2018-11-13
2 1 4 2018-11-12
3 1 2 2018-11-11
4 2 5 2018-11-12
在上面,我想显示 Bob,因为他的最新历史记录与他当前的得分不同,但不显示 Tom,因为他是匹配项
我尝试使用类似的东西:
SELECT u.id, u.name, u.current_score
FROM users u
where u.current_score not in
(select h.score from histories h where
h.user_id=u.id order by h.date desc limit 1)
这引发了一个错误:
#1235 - This version of MariaDB doesn't yet support
'LIMIT & IN/ALL/ANY/SOME subquery'
如果我删除限制 1 那么它 return 用户中的几乎所有行 - 每个 table 中有几千行但我认为它应该 return大约 50,但它 return 在 4,285 行可能的行中超过 4,100 行
- 在
Select
子句本身内确定相关子查询中的最新历史分数。 Group By
在用户上,并使用HAVING
子句来考虑当前分数与历史中最新分数不匹配的情况- 我必须对分值使用
MAX()
聚合函数,这样它才符合有效的 ANSI SQLGROUP BY
。它不会影响任何东西,因为各自的分数值只有一个(因此只有最大值)。
请尝试以下操作:
SELECT u.id,
u.name,
MAX(u.current_score) AS m_current_score,
MAX((select h.score
from histories h
where h.user_id = u.id
order by h.date desc limit 1)) AS history_score
FROM users u
GROUP BY u.id, u.name
HAVING m_current_score <> history_score
您需要的一种方法是使用子查询获取与每个 user_id
的最新历史条目相关的 date
。在此之后,您可以再次加入 table histories
以获取与最新 date
关联的其余列。这是在下一个查询中总结的:
SELECT
u.id,
u.name,
u.current_score,
h.score AS latest_score_from_history
FROM
user AS u
LEFT JOIN
-- This subquery gets the date of the latest history register for every user
(SELECT
user_id,
MAX(date) AS maxDate
FROM
histories
GROUP BY
user_id) AS latest ON latest.user_id = u.id
LEFT JOIN
histories AS h ON h.user_id = latest.user_id AND h.date = latest.maxDate
WHERE
u.current_score <> h.score