我在MariaDB中有两个表,我需要在左表中显示它们的当前分数与历史表中的最新分数不同。
例如:
var title = '';
driver.getTitle().then(function(titulo) {
title = titulo;
});
在上面,我想向鲍勃展示他的最新历史与他目前的成绩不一样,但不向汤姆展示他是一场比赛
我尝试使用以下内容:
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
这引发了错误:
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)
如果我取消限制1,那么它将返回用户中的几乎所有行-每个表中都有几千行,但我认为它应该返回约50行,但它会返回4,100行中的4,100行。
答案 0 :(得分:1)
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
答案 1 :(得分:0)
满足您需求的一种方法是使用子查询,以获取与每个date
的最新历史记录条目相关的user_id
。之后,您可以再次连接表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