【问题标题】:Codesignal.com AlarmClocks SolutionCodesignal.com 闹钟解决方案
【发布时间】:2018-08-05 04:35:53
【问题描述】:

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

开始日期是以下结构的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

谁能给我解释一下?

【问题讨论】:

    标签: mysql sql select union


    【解决方案1】:

    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 UNION Syntax"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-21
      • 2011-08-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多