【发布时间】:2021-10-18 02:33:36
【问题描述】:
我有一个足球比赛,人们可以在其中预测比赛。如果他们认为主队获胜,他们可以给比赛打 1,如果客队获胜,打 2,如果平局打 3。如果他们正确地预测了一场比赛,他们就会得到一分。我的数据库中的表如下所示:
表格匹配
| id | home | away | result | round_id
| --- | ---------| -------- -| -------|----------|
| 1 | id club 1| id club 2 | 1 | id round 1
| 2 | id club 5| id club 4 | 3 | id round 1
| 3 | id club 8| id club 5 | 1 | id round 2
Table predictions
| prediction | user_id | match_id |
| -------- | -------------- | -------- |
| 1 | id user 1 | id match 1
| 3 | id user 1 | id match 2
| 2 | id user 1 | id match 3
最初我想在 PHP 中计算分数,但我认为这也应该只通过 MySQL 来实现。所以我尝试了一些方法并提出了以下查询:
SELECT Count(*) AS points,
username,
round_id
FROM predictions
LEFT JOIN matches
ON predictions.match_id = matches.id
INNER JOIN users
ON predictions.user_id = users.id
WHERE predictions.prediction = matches.result
GROUP BY username,
round_id
ORDER BY points DESC,
username ASC
查询正确地计算了每个用户每轮的得分,唯一的问题是如果参与者在游戏轮中没有任何权利,它根本不会出现在列表中。有没有人知道如果他们有 0 分,该怎么做才能让参与者进入列表?转换为上面提到的表,第 2 轮将不会返回查询,因为其中的唯一匹配项被错误预测。但是,我确实想要这个,因此第 2 轮返回的分数为 0。
我想要的结果:
| points | username | round_id|
| -------- | -------------- | --------|
| 2 | John | 1
| 0 | John | 2
我现在得到的结果:
| points | username | round_id|
| -------- | -------------- | --------|
| 2 | John | 1
【问题讨论】:
-
您的问题有点令人困惑。尝试编辑并澄清您的意思?你的意思是如果第一轮预测是错误的,那么第二轮预测即使是正确的预测也毫无价值???关于显示
0的分数,如果您只是删除WHERE语句和条件,它将显示所有用户和预测。 (实际上WHERE声明是您不希望过滤的原因) -
我想要每个用户每一轮的“总”分。此外,当用户在一轮中没有得分时,则为 0 分。当我删除 WHERE 时,无论预测是否正确,用户都会为每场比赛获得积分。
-
只需删除
WHERE语句和条件,这样您就可能得到您想要的结果。 -
如果您想要所有结果,
LEFT JOIN matches不应该是OUTER JOIN matches吗? -
@kmoser 使用 OUTER JOIN 匹配我很遗憾得到相同的结果。幸运的是,forpas 的解决方案对我有用。
标签: mysql join group-by sum where-clause