我遇到了选择查询的问题,并且无法弄清楚如何解决问题。我有两张桌子:
TABLE_students
|--------|------------|--------|
| STU_ID | EMAIL | NAME |
|--------|------------|--------|
| 1 | a@e.com | Bob |
| 2 | b@e.com | Joe |
| 3 | c@e.com | Tim |
--------------------------------
TABLE_scores
|--------|------------|-------------|--------|
| SRE_ID | STU_ID | DATE | SCORE |
|--------|------------|-------------|--------|
| 91 | 2 | 2018-04-03 | 78 |
| 92 | 2 | 2018-04-06 | 89 |
| 93 | 3 | 2018-04-03 | 67 |
| 94 | 3 | 2018-04-06 | 72 |
| 95 | 3 | 2018-04-07 | 81 |
----------------------------------------------
我试图从两个表中选择数据,但有一些要求。我需要选择学生,即使他们在分数表中没有分数。我也只想要最新的分数记录。
以下查询仅返回具有分数的学生,并且还重复返回总共5行(因为有五个分数)。我想要的是查询返回三行(每个学生一个)和他们的最新得分值(如果他们没有得分,则为NULL):
SELECT students.NAME, scores.SCORE FROM TABLE_students as students, TABLE_scores AS scores WHERE students.STU_ID = scores.STU_ID;
我很难确定如何拉动所有学生,无论他们是否有分数,如果他们有分数,如何只提取最新分数。
谢谢!
答案 0 :(得分:1)
这是greatest-n-per-group问题的变体,这在Stack Overflow上很常见。
我会通过几个连接来做到这一点:
$("#newsTitle").keypress(function() {
if($(this).val().length == 20) {
document.getElementById('newsTitle').style.borderColor = "red";
}
});
如果c2.STU_ID为null,则表示LEFT JOIN没有匹配c1中的行具有更大日期(或者是平局时更大的SRE_ID)的行。这意味着c1中的行必须是最新的,因为没有其他更新的行。
P.S。:请学习SELECT s.NAME, c1.DATE, c1.SCORE
FROM students AS s
LEFT JOIN scores AS c1 ON c1.STU_ID = s.STU_ID
LEFT JOIN scores AS c2 ON c2.STU_ID = s.STU_ID
AND (c2.DATE > c1.DATE OR c2.DATE = c1.DATE AND c2.SRE_ID > c1.SRE_ID)
WHERE c2.STU_ID IS NULL;
语法,并避免使用"逗号样式"连接。 JOIN
自1992年以来一直是标准。
P.P.S。:我删除了多余的" TABLE _"来自表名的前缀。您不需要使用表名来提醒自己它是一张桌子! : - )
答案 1 :(得分:0)
您可以使用相关子查询:
SELECT *,
(SELECT score FROM TABLE_scores sc
WHERE sc.stu_id = s.stu_id ORDER BY DATE DESC LIMIT 1) AS score
FROM TABLE_students s