2016-05-26 22 views
0

Ich möchte eine Abfrage erstellen, die Daten in eine Tabelle einfügt und überprüft, ob mein Datumsbereich die bereits vorhandenen Datumsbereiche überlappt.MySQL einfügen-Anweisung doppelte Einträge

Ich erstellte die folgende Arbeitsabfrage, aber es fügt 2 Zeilen mit denselben Daten ein. Kannst du etwas falsch finden?

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 bedeutet der Start-Timestamp, Ende ist der End-Timestamp. In der Unterabfrage möchte ich prüfen, ob die Zeitstempel, die ich einfügen möchte, sich überlappen. Wenn sie wollen, bekomme ich einen Fehler und wenn sie die Abfrage nicht einfügen die Daten einfügen.

Vielen Dank im Voraus.

+3

Sie mischen 'und' und' or' ohne '' '', um Parsing-Reihenfolge zu erzwingen. Das ist fast immer ein Zeichen für einen Fehler. –

+0

Ich denke, es ist besser Programmiersprache verwenden, um Ihre Abfrage zu moderieren –

Antwort

0

Sie benötigen einen SQL-Ausdruck, der einen booleschen Wert generiert, abhängig davon, ob ein Datumsbereich einen anderen überlappt oder nicht. Siehe this SO answer

Was Sie verwenden, scheint nicht korrekt. Ich kann nicht genau bestimmen, warum, oder eine bessere Abfrage vorschlagen, ohne das Tabellenschema zu kennen. Kannst du das posten?

0

Sie sollten Klammern verwenden, um verschiedene Teile von OR-Operatoren zu unterscheiden. Ich denke, die Antwort lautet:

Allerdings weiß ich nicht die Bedeutung dieser Fragezeichen in MySql. :)

1

Ich glaube, das ist die Logik, die Sie wollen. Vor allem möchten Sie not exists. Zweitens, müssen Sie die Datum Arithmetik korrekt erhalten:

Verwandte Themen