Аватар для djason
6 / 5 / 3
Регистрация: 23.08.2012
Сообщений: 143

Как сделать select и update одним запросом что бы потом узнать id этой обновленной записи

18.09.2019, 06:35. Показов 8255. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет друзья! Перейду сразу к сути! Много рылся в интернете по данному вопросу и нашёл только варианты, как сделать update и select одним запросом, но мне нужно наоборот, что бы знать id обновленной записи. Есть два запроса:
SQL
1
"SELECT `id` FROM `table` WHERE `info` IS NULL"
SQL
1
"UPDATE `table` SET `name` = 'Петя' WHERE `id` = ?"
Скажу сразу, знаю про INSERT и last_insert_id, но мне нужно обновить одну из существующих записей info у которой значение NULL, а потом получить ее id (точнее получить id записи которая имеет значение NULL, а потом обновить и дальше работать со значением id).
То что можно сделать два запроса я тоже знаю, что иногда даже быстрее, но мне нужно именно один запрос, что бы во время этих двух запросов кто то другой не получил id этой записи и не возникло конфликтов. Знаю про блокировку записи если вложенный запрос обращается к одной и той же колонке. Есть вариант с временными переменными, но как слить два выше перечисленных запроса и создать один, что бы потом вытащить id обновленной записи, ума не приложу.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.09.2019, 06:35
Ответы с готовыми решениями:

Выбрать данные, посчитать строки и сделать update одним запросом
Здравствуйте, есть таблица films(родительская) CREATE TABLE `films` ( `film_id` bigint(20) NOT NULL, `availableForGame`...

Как обработать несколько select одним запросом ajax?
Всем привет, имеется задача, нужно вывести предварительную сумму на основании 2х параметров. Параметры задаются в 2х или более...

Как узнать наименование и содержание измененных полей запросом UPDATE
Доброго времени суток форумчане. Подскажите пожалуйста, не понимаю как можно реализовать следующее: Выполняется обновление записи в базе...

13
231 / 163 / 54
Регистрация: 26.10.2014
Сообщений: 928
18.09.2019, 08:45
ничего не понял, но очень интересно

MySQL
1
UPDATE `table` SET `name` = 'Петя' WHERE `id` = (SELECT `id` FROM `table` WHERE `info` IS NULL LIMIT 1)
так что ли?

Добавлено через 2 минуты
но это тоже самое что
MySQL
1
UPDATE `table` SET `name` = 'Петя' WHERE `info` IS NULL
Добавлено через 6 минут
Цитата Сообщение от djason Посмотреть сообщение
дальше работать со значением id
только с переменной.
MySQL
1
2
set @id := (SELECT `id` FROM `table` WHERE `info` IS NULL);
UPDATE `table` SET `name` = 'Петя' WHERE `id` = @id;
Добавлено через 4 минуты
эволюционировал
MySQL
1
2
3
SET @id := 0;
UPDATE `table` SET `name` = 'Петя', id = (SELECT @id := id) WHERE id = (SELECT `id` FROM `table` WHERE `info` IS NULL LIMIT 1); 
SELECT @id;
1
 Аватар для djason
6 / 5 / 3
Регистрация: 23.08.2012
Сообщений: 143
18.09.2019, 09:21  [ТС]
mac1eod, можно ли такие запросы с переменной, которые вы перечислили ниже, писать в одну строчку? У меня биндится запрос через mysqli. Просто я пробовал как вы сделать подобный запрос mysqli ругался на SQL запрос, мол составлен не верно... Возможно я действительно не верно составил, но пробовал самый простой подобный запрос с указанием переменной, на что он ругался. Попробую ваш запрос посмотрим, только вопрос в том можно ли его в mysqli писать в одну строчку.
0
231 / 163 / 54
Регистрация: 26.10.2014
Сообщений: 928
18.09.2019, 09:31
djason, я думаю, можно написать и в одну строчку, главное то разделители строк, те ;
1
 Аватар для djason
6 / 5 / 3
Регистрация: 23.08.2012
Сообщений: 143
18.09.2019, 21:02  [ТС]
mac1eod, только я что то не пойму как вытащить эту переменную, не могли бы вы привести простой пример кода?
0
 Аватар для djason
6 / 5 / 3
Регистрация: 23.08.2012
Сообщений: 143
19.09.2019, 08:08  [ТС]
mac1eod, а зачем здесь...
MySQL
1
UPDATE `table` SET `name` = 'Петя', `id` = (SELECT @id := id)...
в конце мы id обновляем(по задумке он автоинкримент и его не нужно обновлять, а нужно вытащить)?
И первый запрос отличается от второго тем, что в первом происходит выборка, а потом обновление, а второй сначало обновление, потом отдаёт id?
0
231 / 163 / 54
Регистрация: 26.10.2014
Сообщений: 928
19.09.2019, 08:28
Цитата Сообщение от djason Посмотреть сообщение
как вытащить эту переменную
куда вытащить то? в php код?
Цитата Сообщение от djason Посмотреть сообщение
в конце мы id обновляем(по задумке он автоинкримент и его не нужно обновлять, а нужно вытащить)?
он обновляется на то же самое значение, что и было до обновления. фактически изменения данных не происходит. это нужно что бы присвоить переменной @id значение текущего id и при этом обойтись одним запросом.
Цитата Сообщение от djason Посмотреть сообщение
а второй сначало обновление, потом отдаёт id?
я бы сказал что во втором запросе обновление и присвоение переменной происходит одновременнно
1
 Аватар для djason
6 / 5 / 3
Регистрация: 23.08.2012
Сообщений: 143
19.09.2019, 08:55  [ТС]
mac1eod, да в php сделать именно выборку значение переменной id. Где не читал про пользовательские переменные там только примеры запросов, но не слова про то как их вытащить и как происходит выборка этого значения в php.
Например конектюсь к БД, делаю следующий запрос:
PHP
1
2
3
4
...
$sql  = "SET @id := 0; UPDATE `table` SET `name` = 'Петя', id = (SELECT @id := id) WHERE id = (SELECT `id` FROM `table` WHERE `info` IS NULL LIMIT 1); SELECT @id;"
$result = mysql_query($connect, $sql);
...а что тут?
0
231 / 163 / 54
Регистрация: 26.10.2014
Сообщений: 928
19.09.2019, 09:58
djason, я не слишком близок с пхп, по моему в $result должен получиться результат выполнения запроса, разве нет?
0
 Аватар для djason
6 / 5 / 3
Регистрация: 23.08.2012
Сообщений: 143
19.09.2019, 10:10  [ТС]
mac1eod, в том то и дело, что должен, запрос проходит но возвращает не результатирующую выборку, а true, запрос прошёл как будто только на update, а select не возвращает.
0
231 / 163 / 54
Регистрация: 26.10.2014
Сообщений: 928
19.09.2019, 10:18
djason, используйте хранимую функцию. она будет производить обновление и возвращать значение id
я бы так и сделал, поскольку пхп для меня темный лес.
1
 Аватар для djason
6 / 5 / 3
Регистрация: 23.08.2012
Сообщений: 143
19.09.2019, 11:03  [ТС]
mac1eod, хорошо посмотрю, но все ровно интересно что не так, не хотелось бы лезть в другие дебри, потому что по логике вашего составленного запроса все вроде бы должно работать, поэтому я хочу разобраться в этом, тем более у меня все запросы построены на php и msqli.
0
231 / 163 / 54
Регистрация: 26.10.2014
Сообщений: 928
19.09.2019, 11:10
djason, все так... update, insert, delete не возвращают никаких данных, кроме true false
0
 Аватар для djason
6 / 5 / 3
Регистрация: 23.08.2012
Сообщений: 143
19.09.2019, 11:35  [ТС]
mac1eod, да я про это и говорил чуть выше, просто думал, что в конце стоит ...; SELECT @id; и как бы это по логике вещей и должна быть выборка этой переменной, попробую первый предложенный вами вариант.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.09.2019, 11:35
Помогаю со студенческими работами здесь

EXISTS и SELECT одним запросом
Коллеги, добрый день. Столкнулся с задачкой, но не могу придумать оптимальное решение. Хранимая выводит таблицу, но надо еще вернуть...

select и update одним запросов
SELECT dUserId, dMoney, dParts, pPercent, TRUNCATE(pPeriod / pAdd, 0) AS totalParts , TRUNCATE( ( UNIX_TIMESTAMP( NOW( ) ) -...

Как сделать так, чтобы при клике на рубрику выводились все записи, что в этой рубрике
На страницу выводятся рубрики. Как сделать так, чтобы при клике на рубрику выводились все записи, что в этой рубрике?

Как сделать одним запросом в бд SQL чтобы сложить все столбцы?
Мне необходимо сложить все значения столбца summ. Как это сделать? это можно сделать одним запросом с параметрами mont ='6' или это делать...

Можно ли сделать такую выборку одним запросом или как их обьеденить?
В продолжении темы https://www.cyberforum.ru/mysql/thread1136099.html. Есть у меня таблицы: Message(id, fromUserId, toUserId,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

Новые блоги и статьи
Анализ и линтинг кода JavaScript: ESLint, Prettier и JSHint
run.dev 26.04.2025
JavaScript прошёл долгий путь от простого языка для анимации веб-страниц до основы современной веб-разработки. С ростом сложности приложений, увеличением кодовых баз и масштабированием команд. . .
Паттерны в Python: Singleton, Factory и Observer
py-thonny 26.04.2025
Паттерны проектирования — это проверенные временем решения типовых проблем разработки программного обеспечения. Их история берёт начало с книги "Приёмы объектно-ориентированного проектирования. . . .
Исключения в C#: Stack Overflow, Access Violation и Out of memory
stackOverflow 26.04.2025
Исключения в C# — это не только механизм оповещения о проблемах, а целое искусство управления потоком выполнения программы в экстремальных ситуациях. Обычное исключение, например,. . .
Логирование в C# ASP.NET Core с помощью Serilog, ElasticSearch, Kibana
stackOverflow 25.04.2025
Помните те времена, когда для анализа проблемы приходилось подключаться к серверу, искать нужный лог-файл среди десятков других и вручную фильтровать тысячи строк в поисках ошибки? К счастью, эти дни. . .
Структура "железный OnKeyUp" вместо антидребезга. Полностью асинхронный счётчик.
Hrethgir 25.04.2025
Программа для симуляции схемы - Logisim Evolution В общем какое-то время отвлёкся, так было надо, теперь когда запилю это на verilog и FPGA , досоставлю заявку в ФИПС на полезную модель - не готов. . .
Автоматизация Amazon Web Services (AWS) с Boto3 в Python
py-thonny 25.04.2025
Облачные вычисления стали неотъемлемой частью современной ИТ-инфраструктуры, а Amazon Web Services (AWS) занимает лидирующие позиции среди провайдеров облачных услуг. Управление многочисленными. . .
Apache Kafka vs RabbitMQ в микросервисной архитектуре
ArchitectMsa 25.04.2025
Современная разработка ПО всё чаще склоняется к микросервисной архитектуре — подходу, при котором приложение разбивается на множество небольших, автономных сервисов. В этой распределённой среде. . .
Параллельное программирование с OpenMP в C++
NullReferenced 24.04.2025
Параллельное программирование — подход к созданию программ, когда одна задача разбивается на несколько подзадач, которые могут выполняться одновременно. Оно стало необходимым навыком для. . .
Цепочки методов в C# с Fluent API
UnmanagedCoder 24.04.2025
Современное программирование — это не только решение функциональных задач, но и создание кода, который удобно поддерживать, расширять и читать. Цепочки методов и Fluent-синтаксис в C# стали мощным. . .
Мульти-тенантные БД с PostgreSQL Row Security
Codd 23.04.2025
Современные облачные сервисы и бизнес-приложения всё чаще обслуживают множество клиентов в рамках единой программной инфраструктуры. Эта архитектурная модель, известная как мульти-тенантность, стала. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru