假设我有2个表,表1每天包含1条记录,表每天包含多条记录,
表1
id | date | number
1 | 01/01/2018 | 14
2 | 02/01/2018 | 2
3 | 03/01/2018 | 82
4 | 04/01/2018 | 61
表2
id | name | number | winner | username
1 | 01/01/2018 | 1 | 0 | Joe Bloggs
2 | 01/01/2018 | 2 | 0 | Jim Bloggs
3 | 01/01/2018 | 3 | 0 | Sarah Bloggs
4 | 01/01/2018 | 4 | 0 | David Bloggs
5 | 01/01/2018 | 5 | 0 | Sam Bloggs
6 | 02/01/2018 | 1 | 0 | Mark Bloggs
7 | 02/01/2018 | 2 | 1 | Phil Bloggs
8 | 02/01/2018 | 3 | 0 | Steve Bloggs
9 | 03/01/2018 | 1 | 0 | Ben Bloggs
10| 03/01/2018 | 2 | 0 | Bill Bloggs
每当用户输入抽奖时,就会给他们一个数字。如果该数字与表1中的比赛日期相匹配,则他们获胜,否则就输了。然后将他们输入的用户名和号码输入表2,这样我们就记录了每个玩过的人。
我需要获得所有获奖者的列表(每天1个),但是如果没有获奖者,请显示日期行,但显示“无获奖者”。
因此理想地,根据以上数据,我的结果将如下所示:
id | date | winner | username
1 | 01/01/2018 | 0 | No Winner
2 | 02/01/2018 | 1 | Joe Bloggs
3 | 03/01/2018 | 0 | No Winner
在表1上加入表2并优先排列获胜行,否则显示“没有获胜者”的最佳方法是什么?
答案 0 :(得分:1)
一个简单的左联接应该在这里起作用:
SELECT
t1.id,
t1.date,
COALESCE(t2.winner, 0) AS winner,
COALESCE(t2.username, 'No Winner') AS username
FROM table1 t1
LEFT JOIN table2 t2
ON t1.date = t2.date AND t2.winner = 1
ORDER BY
t1.date;
此答案假设在给定日期最多只有一个获胜者。之所以起作用,是因为我们可以通过第二个表的对应列上有一个NULL
值来确定是否没有赢家的存在,如果连接条件失败,这会发生。