LINUX.ORG.RU

SQL запрос

 , , , ,


0

2

Требуется написать определенный sql-запрос, который записывает значение в определенную ячейку определенной строки. То есть доработать запрос вида

SELECT id, id_user, time
FROM users
WHERE date > "2012-01-01"
ORDER BY date desc

Что бы в первую строку, полученную в запросе записал в time новое значение

★★★★★

Последнее исправление: sol13 (всего исправлений: 2)
Ответ на: комментарий от helios

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

sol13 ★★★★★
() автор топика
Ответ на: комментарий от anonymous

есть отгадка на загадку?

sol13 ★★★★★
() автор топика
Ответ на: комментарий от sol13

Ну ты сам сказал:

Нужно просто сделать инсерт значения именно в нужную ячейку, а получить ее мы должны после селекта.

Так и делаем INSERT INTO ... (`rowName`) VALUES('value') WHERE;
Ну и потом SELECT ... FROM ... WHERE `id` IN (SELECT LAST_INSERT_ID() FROM ...)

Чтобы за время наших манипуляций никто не поправил запись, делаем сначала START TRANSACTION; в конце - COMMIT;

helios ★★★★★
()

SQL вобще-то разный везде, если interbase (firebird) то запрос в хранимую процедуру поместить и там в for select искать нужный id строки

или вьюшку сделать select из нужной строки и всех остальных

или ввести в таблицу новое поле и проапдейтить его нужным значением а потом делать SELECT id, id_user, temp_time time

ilovewindows ★★★★★
()
Ответ на: комментарий от ilovewindows

проблема в том, что я изначально не знаю в какую строчку мне придется вписать значение, я делаю селект с ордер и вижу мою строчкой первой и именно в нее в нужную часть, в моем случае поле time я запишу новое значение, в time до этого было другое значение.

sol13 ★★★★★
() автор топика
Ответ на: комментарий от sol13

как вписать в определенную ячейку таблицы?

Если строки не существует - вставляем строку, сами указываем только колонку rowName (остальные забьются дефолтами или NULL):

INSERT INTO ... (`rowName`) VALUES('value') WHERE;

Если строка существует и нужно «отредактировать» одно поле, то

UPDATE `table` SET `rowName` = 'value' WHERE ...;

helios ★★★★★
()
Ответ на: комментарий от helios

хорошо, тогда как мне узнать строчку в которую я могу вписать это значение, ее номер после запроса?

sol13 ★★★★★
() автор топика
Ответ на: комментарий от sol13

проблема в том, что я изначально не знаю в какую строчку мне придется вписать значение, я делаю селект с ордер и вижу мою строчкой первой и именно в нее в нужную часть, в моем случае поле time я запишу новое значение, в time до этого было другое значение.

UPDATE `table` SET `time` = 'value' WHERE `id` IN ( SELECT `id` FROM `table` WHERE ... ORDER BY ... LIMIT 1 )

helios ★★★★★
()
Ответ на: комментарий от helios

Правда ругается что-то #1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

UPDATE users SET time = "13:30:00" WHERE id IN ( SELECT id FROM users WHERE date = "2012-01-01" Order by date desc LIMIT 1)
sol13 ★★★★★
() автор топика
Ответ на: комментарий от sol13

так если время известно можно сразу апдейт записей с нужным временем без выборки id, эта «первая» запись меняется что ли постоянно или нет ?

ilovewindows ★★★★★
()
Ответ на: комментарий от sol13
select concat('UPDATE users SET time = "13:30:00" WHERE id =',id)
from (SELECT * FROM users WHERE date = "2012-01-01")
Order by date desc
LIMIT 1

Результат запустить ещё раз

vahtu
()
Ответ на: комментарий от vahtu

хорошо попробую, жаль, что одним запросом не реализовать

sol13 ★★★★★
() автор топика
Ответ на: комментарий от sol13

Апострофы вместо кавычек поставь, если у тебя ansi совместимость не включена.

Двойные кавычки не используются в mysql.

vahtu
()
Ответ на: комментарий от sol13

Так не работает, выдает ошибку тоже, но уже другую. нужно что-то перед From

А time - не зарезервированное слово? Мб все поля заключить в ``?

helios ★★★★★
()
Ответ на: комментарий от helios

mysql лояльнее относится в ключевым словам в именах полей, чем M$.

Правда есть опция, которая это отключает. :)

vahtu
()
Ответ на: комментарий от vahtu

запрос не сработает, так как у меня id может повторятся то есть к id = 1 может быть и у 2012-01-01 и у 2012-01-06

sol13 ★★★★★
() автор топика
Ответ на: комментарий от helios

пробовал такое, у меня time а time_a записано, это в примере так сделал

sol13 ★★★★★
() автор топика

делай 2 запроса: в первом первую строку найди и прицепи к ней нужную дату, а вторым запросом все остальное найди. Ну и объедини полученные множества.

RedPossum ★★★★★
()
Ответ на: комментарий от RedPossum

у меня у разных пользователей может быть одна и та же дата, я забыл добавить в шапку, сейчас исправлю.

sol13 ★★★★★
() автор топика
Ответ на: комментарий от RedPossum

не дает исправить

SELECT id, id_user, time
FROM users
WHERE id = "1" and id_user = "alex" and date > "2012-01-01" 
ORDER BY date desc
sol13 ★★★★★
() автор топика
Ответ на: комментарий от vahtu

Таблица ввида:

id id_user date time_on time_off

1 12345 2012-01-01 09:00 09:30

1 12346 2012-01-01 09:10 10:30

2 2 2012-01-01 09:00 09:30

2 1 2012-01-01 09:00 10:30

Нужно если у нас есть уже значение с определенным id, id_user, date, time_on заменить в этой строке time_off на другое значение, не добавляя новых строк

sol13 ★★★★★
() автор топика
Ответ на: комментарий от vahtu

ошибки в основном синтаксиса, ну кроме той, что на limit ругается, This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

sol13 ★★★★★
() автор топика
SET @rownum=0;
SELECT @rownum:=@rownum+1 AS rownum, id, id_user, time 
FROM users
WHERE date > "2012-01-01" and rownum=1
ORDER BY date desc

?

anonymous
()
Ответ на: комментарий от sol13
UPDATE users 
SET time = "13:30:00" 
WHERE id IN ( SELECT @rownum:=@rownum+1 AS rownum, p.id AS id 
FROM users p, (SELECT @rownum:=0) r 
WHERE date = "2012-01-01" and rownum=1 
order by date desc);

?

anonymous
()
Ответ на: комментарий от anonymous

вопрос решил. спасибо за помощь. Изначаль забиваю time_of пустым, нахожу пустые time_of и записываю туда нужное значение.

sol13 ★★★★★
() автор топика
Ответ на: комментарий от sol13

MySQL не позволяет использовать LIMIT в подзапросе IN - но зачем тут IN, если подзапросом возвращается одна строка? Используй «=»

UPDATE users SET time = «13:30:00» WHERE id = ( SELECT id FROM users WHERE date = «2012-01-01» Order by date desc LIMIT 1)

kvap
()
Ответ на: комментарий от sol13

Нужно если у нас есть уже значение с определенным id, id_user, date, time_on заменить в этой строке time_off на другое значение, не добавляя новых строк

Тогда включить эти поля в уникальный ключ и, как выше советовали, insert ... on duplicate key update time_of = ...

А ещё есть параметр default для поля типа timestamp, который on update currenttimestamp. См. здесь

Если честно я так и не понял, чего ты добивался (добился). В следующий раз добавь вывод запроса show create table ...

vahtu
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.