MySQL优先处理行(如果存在),如果不显示其他内容

时间:2018-08-22 07:43:24

标签: mysql

假设我有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并优先排列获胜行,否则显示“没有获胜者”的最佳方法是什么?

1 个答案:

答案 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;

enter image description here

Demo

此答案假设在给定日期最多只有一个获胜者。之所以起作用,是因为我们可以通过第二个表的对应列上有一个NULL值来确定是否没有赢家的存在,如果连接条件失败,这会发生。