mysql - Codesignal.com 闹钟解决方案

标签 mysql sql select union

您正在开发一个闹钟应用程序,其工作原理如下:用户可以设置日期和时间,该应用程序将从给定日期开始每周在给定时间响铃,直到今年年底。

开始日期是以下结构的 userInput 表中的唯一记录:

input_date:第一个警报的日期和时间(DATETIME 类型)。 给定该表,您的任务是用单列 Alarm_date 组成结果表。此列应包含闹钟按升序响起的所有日期(包括时间)。

inout1 inout2

 CREATE PROCEDURE alarmClocks()
 BEGIN
 select @a alarm_date
    from userInput, 
         (select 1 union select 2 union select 3 union select 4) x,
         (select 1 union select 2 union select 3 union select 4) y,
         (select 1 union select 2 union select 3 union select 4) z
    where year(ifnull(@a:=date_add(@a, interval 1 week), @a:=input_date)) 
        = year(input_date);
 END

我不明白这个语法

(select 1 union select 2 union select 3 union select 4) x

谁能给我解释一下吗?

最佳答案

UNION 通过将第二个操作数“从上到下”附加到第一个操作数来组合两个关系(例如 SELECT 的结果集)。

在您的示例中,SELECT 1 可能如下所示:

+---+
| 1 |
+===+
| 1 |
+---+

选择2:

+---+
| 2 |
+===+
| 2 |
+---+

SELECT 1 UNION SELECT 2 将导致:

+---+
| 1 |
+===+
| 1 |
+---+
| 2 |
+---+

其他查询依此类推。您的整个 SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 将导致:

+---+
| 1 |
+===+
| 1 |
+---+
| 2 |
+---+
| 3 |
+---+
| 4 |
+---+

UNION 还可以消除重复项。即 SELECT 1 UNION SELECT 1 将导致:

+---+
| 1 |
+===+
| 1 |
+---+

不会导致:

+---+
| 1 |
+===+
| 1 |
+---+
| 1 |
+---+

如果您想保留重复项,则必须使用UNION ALL,这不会消除重复项。因此 SELECT 1 UNION ALL SELECT 1 将导致:

+---+
| 1 |
+===+
| 1 |
+---+
| 1 |
+---+

另请注意,由于重复消除会导致开销,所以如果知道集合无论如何都不会有任何重复项,UNION ALL 也是首选。您的示例就是这种情况 - 我们知道 {1,2,3,4} 没有重复项。因此,SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 是更好的选择(尽管如此小的集合的开销可能可以忽略不计)。

更多信息:"13.2.10.3 UNION Syntax"

关于mysql - Codesignal.com 闹钟解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51691421/

相关文章:

MySQL 事务回滚用户定义的错误

mysql - 查询最近 30 天内不存在的同一个表的记录

javascript - jQuery/JS : Select change even does not trigger on change from Jquery code

mysql在一列中计算某些列的值

mysql - 选择一个表中不在另一个表中的数据

mysql - 如何从 friend 的表中查询 friend 的名字

mysql 使用内连接和子查询进行查询

mysql - 客户/公司地址/电话号码

sql - 从同一个表的组中减去值

sql - VBA 错误 3134 INSERT INTO 语句中的语法错误