2016-04-30 12 views
1

Ich versuche, eine bestimmte Zeile in einer Datenbank mit SELECT und OFFSET auswählen. Das Ergebnis ist logisch und ich bekomme die gewünschte Zeile. Aber dann muss ich das gleiche spezifische Zeile aktualisieren, damit ich etwas tun, wie folgt aus:MySQL Query - Verwenden Sie SELECT innerhalb eines UPDATE

UPDATE table 
SET value=1 
WHERE value IN (SELECT * FROM(
SELECT value FROM table WHERE some criteria LIMIT 1 OFFSET 2) temp_tab); 

Nun, was ich von diesem Code erwarten ist nur die ausgewählte Zeile zu aktualisieren. Stattdessen aktualisiert es alle Zeilen in der Datentabelle und setzt ihren Wert auf 1

Wenn ich nur verwenden:

SELECT * FROM(
    SELECT value FROM table WHERE some criteria LIMIT 1 OFFSET 2) temp_tab 

ich nur 1 Zeile wie der Ausgang. (LIMIT 1 OFFSET 2 stellt sicher, dass ich die 1 Zeile bekomme und es ist die 2te verfügbar) Ich bin mir nicht ganz sicher, was ich falsch mache oder wie ich das erreichen soll.

Hinweis: Ich muss SELECT und nicht eine andere Methode verwenden eindeutige ID der Zeile oder etwas ähnliches verwenden. Jede Hilfe würde sehr geschätzt werden.

+0

Verwenden Sie nicht "Wert". Verwende etwas Einzigartiges wie "id". '... WHERE ID IN ...' –

+0

@juergend d In meinem Fall muss ich eine SELECT-Anweisung verwenden, um diese bestimmte Zeile anzugeben und die Art, wie ich sie auswähle, indem ich OFFSET X verwende (weil die Kriterien in der WHERE-Ursache make Sicher, ich bekomme die Zeilen, die ich will, aber dann brauche ich nur 1 von ihnen) und was ich erwarte ist, dass Wert nur auf der ausgewählten Zeile auf 1 gesetzt wird, wo ich WHERE Wert IN (Auswahl), sondern das SET auf alle Zeilen angewendet wurde in der Tabelle nicht nur die Auswahl. Entschuldigung für mein schlechtes Englisch, falls Sie Probleme haben, mich zu verstehen. – Chogart

+0

Ich verstehe es. Aber warum sollte 'SELECT value from your_table' verwendet werden? Do 'UPDATE Tabelle SET Wert = 1 WHERE ID IN (SELECT * FROM ( SELECT ID FROM Tabelle WHERE einige Kriterien LIMIT 1 OFFSET 2) temp_tab) 'stattdessen. –

Antwort

1

Erstens, wenn Sie LIMIT und OFFSET verwenden, müssen Sie auch ORDER BY verwenden. Andernfalls ist die Zeile, die Sie erhalten, unbestimmt. Eine Methode verwendet LIMIT in der UPDATE selbst. UPDATE erlaubt jedoch nicht OFFSET. Also:

UPDATE table 
    SET value = 1 
    WHERE some criteria 
    ORDER BY ?? 
    LIMIT 1; 

Die beste Methode würde eine eindeutige ID verwenden. Sie können mit dem Doppel subquery Ansatz, um dies zu tun:

UPDATE table 
    SET value = 1 
    WHERE id IN (SELECT id 
       FROM (SELECT id 
         FROM table 
         WHERE some criteria 
         ORDER BY ?? 
         LIMIT 1 OFFSET 2 
        ) t 
       ); 

Wenn Sie nicht eine einzige eindeutige ID haben, können Sie mehrere Spalten verwenden, die eindeutig eine einzelne Zeile definieren.

+1

Brilliant! Danke, genau das hat mein Problem gelöst. Nun, nicht genau ... aber es gab mir eine bessere Vorstellung davon, wie die Dinge funktionieren, also habe ich es geschafft, mein Ziel zu erreichen. Vielen Dank noch mal! – Chogart