codesignal.com警报时钟解决方案

3pmvbmvn  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(287)

您正在开发一个闹钟应用程序,它的工作原理如下:用户可以设置日期和时间,并且该应用程序将在给定的时间每周响铃,从给定的日期开始,直到今年年底。
开始日期是以下结构的userinput表中的唯一记录:
输入日期:第一次报警的日期和时间(日期时间类型)。给定这个表,您的任务是用一个列组成结果表。此列应包含闹钟按升序响的所有日期(包括时间)。
输入1输入2

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

有人能给我解释一下吗?

mkh04yzy

mkh04yzy1#

UNION 组合两个关系(例如 SELECT )通过将第二个操作数“从上到下”附加到第一个操作数。
在你的例子中 SELECT 1 可能看起来像:

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

以及 SELECT 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联合语法”

相关问题