2016-04-30 5 views
1

Я пытаюсь выбрать определенную строку в базе данных с помощью SELECT и OFFSET. Результат, который я получаю, логичен, и я получаю желаемую строку, которую я хочу. Но тогда мне нужно обновить ту же самую конкретную строку, так что я сделать что-то вроде этого:Запрос MySQL - используйте SELECT внутри UPDATE

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

Теперь то, что я ожидаю от этого кода является обновление выбранной строки ТОЛЬКО. Вместо этого он обновляет все строки в DataTable и устанавливает их значение 1.

Когда я использую только:

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

я получаю только 1 строку в качестве выхода. (LIMIT 1 OFFSET 2 гарантирует, что я получу 1 строку, и это 2-й доступ). Я не совсем уверен, что я делаю неправильно или как я должен это делать.

Примечание: Мне нужно использовать SELECT, а не какой-либо другой метод, используя уникальный идентификатор строки или что-то подобное. Любая помощь будет принята с благодарностью.

+0

Не используйте 'значение'. Используйте что-то уникальное, как 'id'. '... WHERE id IN ...' –

+0

@juergend d В моем случае мне нужно использовать инструкцию SELECT, чтобы указать эту конкретную строку и способ, которым я ее выбираю, используя OFFSET X (потому что критерии в WHERE вызывают конечно, я получаю строки, которые я хочу, но потом мне нужно только 1 от них), и я ожидаю, что это значение установлено на 1 только на этой выбранной строке, где я сделал WHERE value IN (выбор), но вместо этого SET применяется ко всем строкам в таблице, а не только выбор. Извините за моего бедного английского, если у вас возникли проблемы с пониманием меня. – Chogart

+0

Я понимаю. Но зачем использовать 'SELECT значение из вашей_таблицы'? Do 'UPDATE table SET value = 1 WHERE id IN (SELECT * FROM ( SELECT id FROM table WHERE некоторые критерии LIMIT 1 OFFSET 2) temp_tab) вместо этого. –

ответ

1

Во-первых, при использовании LIMIT и OFFSET вам также необходимо использовать ORDER BY. В противном случае строка, которую вы получаете, является неопределенной.

Один метод использует LIMIT в пределах UPDATE. Однако UPDATE не разрешает OFFSET. Таким образом:

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

Лучший метод будет использовать уникальный идентификатор. Вы можете сделать это с помощью метода двойного подзапроса:

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 
       ); 

Если у вас нет ни одного уникального идентификатора, вы можете использовать несколько столбцов, которые однозначно определяют одну строку.

+1

Блестящий! Спасибо, это именно то, что решило мою проблему. Ну, не совсем ... но это дало мне лучшее представление о том, как все работает, и мне удалось достичь своей цели. Еще раз, спасибо! – Chogart