【问题标题】:MySQL prioritise row if exists, if not show something elseMySQL 如果存在则优先行,如果不存在则显示其他内容
【发布时间】:2018-08-22 07:43:23
【问题描述】:

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

【问题讨论】:

  • 输出中用户名的来源是什么,每个number 列对应什么?
  • 编辑问题

标签: mysql


【解决方案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;

Demo

此答案假设在给定日期最多只有一个获胜者。它之所以有效,是因为我们可以通过来自第二个表的相应列上的 NULL 值来确定没有获胜者的存在,如果连接条件失败,就会发生这种情况。

【讨论】:

    猜你喜欢
    • 2022-12-06
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多