【问题标题】:MySQL insert-Statement double entriesMySQL insert-Statement 双条目
【发布时间】:2016-05-27 00:25:17
【问题描述】:

我想创建一个向表中插入数据并检查我的日期范围是否与现有日期范围重叠的查询。

我创建了以下工作查询,但它插入了 2 行具有相同数据的行。你能发现其中有什么不对吗?

INSERT INTO infoscreen_times (screen_id, start, end, view_id)
SELECT ?, ?, ?, ?
FROM infoscreen_screens
WHERE EXISTS (
    SELECT id
    FROM infoscreen_times
    WHERE ? BETWEEN start AND end
    AND screen_id = ?
    OR ? BETWEEN start AND end
    AND screen_id = ?
    OR ? <= start
    AND ? >= end
    AND screen_id = ?) IS FALSE

start 表示 Start-Timestamp,end 表示 End-Timestamp。在子查询中,我想检查我要插入的时间戳是否相互重叠。如果他们这样做,我想得到一个错误,如果他们不查询插入数据。

提前致谢。

【问题讨论】:

  • 您正在混合 andor 而没有任何 () 来强制解析顺序。这几乎总是一个错误的迹象。
  • 我认为最好使用编程语言来调节您的查询

标签: mysql sql


【解决方案1】:

我相信这是您想要的逻辑。最重要的是,你想要not exists。其次,您需要正确计算日期:

INSERT INTO infoscreen_times (screen_id, start, end, view_id)
    SELECT ?, ?, ?, ?
    FROM infoscreen_screens iss
    WHERE NOT EXISTS (SELECT 1
                      FROM infoscreen_times ist
                      WHERE ist.screen_id = iss.screen_id AND
                            ? <= ist.end AND -- ? is the begin time
                            ? >= ist.begin   -- ? is the end time
                     );

【讨论】:

    【解决方案2】:

    您应该使用括号来区分 OR 运算符的不同部分。我认为答案是:

    INSERT INTO infoscreen_times (screen_id, start, end, view_id) 
    SELECT ?, ?, ?, ? 
    FROM infoscreen_screens 
    WHERE EXISTS (SELECT id FROM infoscreen_times WHERE (? BETWEEN start AND end AND screen_id = ?) OR (? BETWEEN start AND end AND screen_id = ?) OR (? <= start AND ? >= end AND screen_id = ?)) 
    IS FALSE
    

    但是,我不知道MySql中这些问号的含义。 :)

    【讨论】:

      【解决方案3】:

      您需要一个 SQL 表达式来生成布尔值,具体取决于一个日期范围是否与另一个日期范围重叠。见this SO answer

      您使用的内容似乎不正确。我无法准确诊断原因,或者在不知道表架构的情况下建议更好的查询。可以发一下吗?

      【讨论】:

        猜你喜欢
        • 2012-04-15
        • 1970-01-01
        • 2018-12-17
        • 2014-03-12
        • 1970-01-01
        • 2022-10-04
        • 2012-05-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多