php — UPDATE нескольких строк одного поля — MySQL
Задать вопрос
Вопрос задан
Изменён 3 года 2 месяца назад
Просмотрен 425 раз
Есть таблица table в БД, где два поля у них — две записи:
id field1 field2 1 asc 1 2 desc 0
имеется HTML тег select с выбором двух полей:
<select name="filter"> <option value="asc">возрастание</option> <option value="desc">уменьшение</option> </select>
Как у field2 сделать UPDATE, чтобы постоянно были 0 и 1 в зависимости от выбора select на форме? Например, если выбран «возрастание», то в БД asc = 1, desc = 0 и наоборот
- php
- mysql
2
можно в таблицу добавить тригеры на обновление и инсерт
CREATE TRIGGER `tr_upd` BEFORE UPDATE ON `table` FOR EACH ROW BEGIN IF( NEW. field1 == 'asc') THEN SET NEW.field2 = 1; ELSE SET NEW.field2 = 0; END IF; END;
2
Тут можно использовать обычный SQL-запрос, советую пользоваться MySQLi-драйвером, читайте док-ию. сам запрос и псевдо-код:
если выбран OPTION1 (Возрастание): UPDATE `table` SET asc = 1, desc = 0; если выбран OPTION2 (Убывание): UPDATE `table` SET asc = 0, desc = 1;
9
Зарегистрируйтесь или войдите
Регистрация через GoogleРегистрация через Facebook
Регистрация через почту
Отправить без регистрации
Почта
Необходима, но никому не показывается
Отправить без регистрации
Почта
Необходима, но никому не показывается
Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки
Оператор SQL UPDATE: примеры, синтаксис
Оператор SQL UPDATE имеет следующий синтаксис:
UPDATE table_name SET expression [WHERE condition]
Напоминаю, что записи в квадратных скобках [] являются необязательными.
После ключевого слова SET должен идти список столбцов таблицы, которые следует изменить, и новые значения в формате Имя_столбца = значение.
Дополнительное условие, описываемое в операторе SQL WHERE, помогает более гибко совершать манипуляции данными.
Примеры оператора SQL UPDATE. Имеется следующая таблица Planets:
ID | PlanetName | Radius | SunSeason | OpeningYear | HavingRings | Opener |
1 | Mars | 3396 | 687 | 1659 | No | Christiaan Huygens |
2 | Saturn | 60268 | 10759. 22 | — | Yes | — |
3 | Neptune | 24764 | 60190 | 1846 | Yes | John Couch Adams |
4 | Mercury | 2439 | 115.88 | 1631 | No | Nicolaus Copernicus |
5 | Venus | 6051 | 243 | 1610 | No | Galileo Galilei |
Пример 1. С помощью оператора SQL UPDATE изменить название планеты Neptune на Pluton:
UPDATE Planets SET PlanetName = 'Pluton' WHERE ID = 3
В этом примере условие оператора SQL WHERE является обязательным, так как без него все поля столбца PlanetName во всей таблице изменились бы на Pluton. В данном случае, нам приходит на помощь столбец ID, ибо он является Первичным ключом, позволяющим однозначно идентифицировать запись.
Выполним запрос оператором SQL SELECT, чтобы посмотреть изменения в записи:
SELECT * FROM Planets WHERE ID = 3
Результат:
ID | PlanetName | Radius | SunSeason | OpeningYear | HavingRings | Opener |
3 | Pluton | 24764 | 60190 | 1846 | Yes | John Couch Adams |
Пример 2. С помощью оператора SQL UPDATE у первых трех записей таблицы изменить значение наличия колец (HavingRings) на «No» и обнулить поле ID
Код примера для MS SQL Server:
UPDATE TOP(3) Planets SET HavingRings = 'No', ID = NULL
Код примера для MySQL:
UPDATE Planets SET HavingRings = 'No', ID = NULL LIMIT 3
Выполним проверку:
SELECT TOP(3) * FROM Planets
Результат:
ID | PlanetName | Radius | SunSeason | OpeningYear | HavingRings | Opener |
NULL | Mars | 3396 | 687 | 1659 | No | Christiaan Huygens |
NULL | Saturn | 60268 | 10759.22 | — | No | — |
NULL | Neptune | 24764 | 60190 | 1846 | No | John Couch Adams |
sql — обновить несколько значений в одном выражении
Задать вопрос
спросил
Изменено 8 месяцев назад
Просмотрено 257 тысяч раз
У меня есть основная/подробная таблица, и я хочу обновить некоторые сводные значения в основной таблице по сравнению с подробной таблицей. Я знаю, что могу обновить их вот так:
обновить MasterTbl, установить TotalX = (выбрать сумму (X) из DetailTbl, где DetailTbl.MasterID = MasterTbl.ID) обновить MasterTbl, установить TotalY = (выбрать сумму (Y) из DetailTbl, где DetailTbl.MasterID = MasterTbl.ID) обновить MasterTbl, установить TotalZ = (выбрать сумму (Z) из DetailTbl, где DetailTbl.MasterID = MasterTbl.ID)
Но я хотел бы сделать это в одном выражении, примерно так:
update MasterTbl set TotalX = sum(DetailTbl.X), TotalY = sum(DetailTbl.Y), TotalZ = sum(DetailTbl.Z ) из DetailTbl где DetailTbl.MasterID = группа MasterTbl.ID по MasterID
но это не работает. Я также пробовал версии, в которых отсутствует пункт «группировать по». Я не уверен, сталкиваюсь ли я с ограничениями моей конкретной базы данных (Advantage) или с ограничениями моего SQL. Вероятно, последнее. Кто-нибудь может помочь?
- sql
- сервер базы данных преимуществ
Попробуйте это:
Обновление набора MasterTbl TotalX = Сумма (D.X), TotalY = Сумма (DY), TotalZ = Сумма (D.Z) Из MasterTbl M Присоединиться к DetailTbl D На D.MasterID = M.MasterID
В зависимости от того, какую базу данных вы используете, если это не работает, попробуйте это (это нестандартный SQL, но допустимый в SQL Server):
Обновление M Set TotalX = Сумма (D.X), TotalY = Сумма (DY), TotalZ = Сумма (D.Z) Из MasterTbl M Присоединиться к DetailTbl D На D.MasterID = M.MasterID
Как упоминалось в комментариях, если программное обеспечение вашей базы данных не позволяет использовать предложения From в обновлениях, вы должны использовать подход подзапроса, упомянутый в нескольких других ответах
4
Почему вы группируете оператор обновления? Вы уверены, что это не та часть, которая вызывает сбой запроса? Попробуйте это:
обновление MasterTbl поставил TotalX = Сумма(DetailTbl.X), TotalY = Сумма(DetailTbl. Y), TotalZ = Сумма(DetailTbl.Z) из DetailTbl куда DetailTbl.MasterID = MasterID
4
В Oracle решение будет таким:
ОБНОВЛЕНИЕ MasterTbl ПОСТАВИЛ (ВсегоX, ВсегоY, ВсегоZ) = (ВЫБЕРИТЕ СУММУ (X), СУММУ (Y), СУММУ (Z) из DetailTbl, где DetailTbl.MasterID = MasterTbl.ID)
Не знаю, позволяет ли это ваша система.
1
Вы пробовали с подзапросом для каждого поля:
ОБНОВЛЕНИЕ MasterTbl ПОСТАВИЛ TotalX = (ВЫБРАТЬ СУММУ(X) из DetailTbl, где DetailTbl.MasterID = MasterTbl.ID), TotalY = (ВЫБРАТЬ СУММУ(Y) из DetailTbl, где DetailTbl.MasterID = MasterTbl.ID), TotalZ = (ВЫБРАТЬ СУММУ(Z) из DetailTbl, где DetailTbl.MasterID = MasterTbl.ID) КУДА ....
1
Попробуйте это:
обновить MasterTbl M, (выберите сумму (X) как sX, сумма(Y) как sY, сумма(Z) как sZ, MasterID из DetailTbl группа по MasterID) А поставил M. TotalX=A.sX, M.TotalY=A.sY, M.TotalZ=A.sZ куда M.ID=A.MasterID
Если ваша БД поддерживает это, объединение всех 3 обновлений в одну строку sql сэкономит время на обращение к серверу при запросе через локальную сеть. Так что, если ничего не работает, это может дать вам небольшое улучшение. Типичным разделителем нескольких операторов является точка с запятой, например:
'обновить x....;обновить y...;обновить...z'
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя адрес электронной почты и пароль
Опубликовать как гость
Электронная почта
Требуется, но никогда не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
tsql — обновить несколько столбцов в SQL с привязанным составным идентификатором
Задать вопрос
спросил
Изменено 10 лет, 8 месяцев назад
Просмотрено 24к раз
Я пытаюсь обновить несколько столбцов в операторе MS SQL, используя подзапрос. Поиск привел меня к чему-то вроде:
UPDATE table1 УСТАНОВИТЕ col1 = a.col1, col2 = a.col2, col3 = a.col3 ОТ (ВЫБЕРИТЕ столбец1, столбец2, столбец3 из таблицы2, где <выражение>) КАК ГДЕ table1.col1 <выражение>
http://geekswithblogs.net/phoenix/archive/2009/10/13/update-multiple-columns-on-sql-server.aspx
Моя проблема в том, что во внутреннем выражении WHERE
мне нужна ссылка к определенному полю в таблице 1:
ОБНОВЛЕНИЕ таблицы 1 УСТАНОВИТЕ col1 = a.col1, col2 = a.col2, col3 = a.col3 ОТ (ВЫБЕРИТЕ col1, col2, col3 из table2, где table1.col0 = table2.col0) КАК ГДЕ table1.col1 <выражение>
Когда я запускаю этот запрос, я получаю сообщение «Не удалось связать составной идентификатор «table1.col0». «. Очевидно, при использовании этого синтаксиса SQL не может связать текущую запись table1 в подзапросе. Прямо сейчас я повторяю подзапрос для каждого поля и использую синтаксис:
ОБНОВЛЕНИЕ таблицы 1 SET col1 = (подзапрос), col2 = (подзапрос). ..
Но это выполняет подзапрос (что очень дорого) один раз для каждого столбца, чего я хотел бы избежать.
Есть идеи?
- sql
- tsql
- sql-update
на сервере sql вы можете использовать предложение from
в запросе на обновление. Присоединяйтесь к таблицам, как если бы вы выбрали. Обновляемая таблица должна быть включена в соединения.
обновить таблицу_1 установить поле_1 = таблица_2.значение_1 из таблицы_1 внутреннее соединение table_2 на (table_1.id = table_2.id)
Или, если вам не нравится синтаксис объединения, это также будет работать:
UPDATE table1 SET col1 = a.col1, col2 = a.col2, col3 = a.col3 ИЗ таблицы1, таблицы2 как ГДЕ table1.col0 = a.col0 И table1.col1 <выражение>
Ваш автомобиль использует команду CROSS APPLY для обновления нескольких столбцов из подвыбора
UPDATE t1 НАБОР t1.col1 = a.col1, t1.col2 = a.col2, t1.col3 = a.col3 ИЗ таблицы1 t1 ПЕРЕКРЕСТНОЕ ПРИМЕНЕНИЕ (ВЫБЕРИТЕ col1, col2, col3 из table2, где table1.