您正在开发一个闹钟应用程序,其工作原理如下:用户可以设置日期和时间,该应用程序将从给定日期开始每周在给定时间响铃,直到今年年底。
开始日期是以下结构的 userInput 表中的唯一记录:
input_date:第一个警报的日期和时间(DATETIME 类型)。 给定该表,您的任务是用单列 Alarm_date 组成结果表。此列应包含闹钟按升序响起的所有日期(包括时间)。
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
是更好的选择(尽管如此小的集合的开销可能可以忽略不计)。
关于mysql - Codesignal.com 闹钟解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51691421/