MySQL insert-Statement双重条目

时间:2016-05-26 14:57:47

标签: mysql sql

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

我创建了以下工作查询,但它插入了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。在子查询中,我想检查我想要插入的时间戳是否相互重叠。如果他们这样做我想得到一个错误,如果他们不查询插入数据。

提前致谢。

3 个答案:

答案 0 :(得分: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
                     );

答案 1 :(得分:0)

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

您使用的内容似乎不正确。我不能确切地诊断原因,或者在不知道表模式的情况下建议更好的查询。你可以发帖吗?

答案 2 :(得分:0)

您应该使用括号来区分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中这些问号的含义。 :)