SQL UPDATE Syntax

Forums:

Пример можно посмотреть здесь или же остальные примеры здесь, или можно написать смешанный INSERT/UPDATE

+---------+-------------+--------------+--------+
| Infostud_id | cost_certificate | id_id_information | id_id_stud |
+---------+-------------+--------------+--------+
| 1 | 200 | 2 | 1 |
| 2 | 200 | 2 | 3 |
| 3 | 250 | 3 | 3 |
| 4 | 120 | 4 | 4 |
| 5 | 100 | 5 | 5 |
+---------+-------------+--------------+--------+

Eto tablitsya Mnogo ko Mnogim i nado budet delat v nej skidku na 10 % dlya teh kto poseshaet 2 kursi i bolshe ( naprimer stud pod idshnikom 3) .

Key Words for FKN + antitotal forum (CS VSU):

vedro-compota's picture

ммм...разве этой таблицы достаточно чтобы написать запрос? откуда узнать сколько посещает курсов тот же студент с номером "3"

(( naprimer stud pod idshnikom 3) .)

_____________
матфак вгу и остальная классика =)

Croatoan's picture

dostatochno mne kazhetsya potomu chto v etoj tablitse pishetsya kakie kursi on poseshaet .
esli chto tut narisovani vsye tablitsi podryadu:

"infostud"
+-----------+---------------+----------------+-----------+
| Infostud_id | cost_certificate | id_id_information | id_id_stud |
+-----------+---------------+----------------+------------+
| 1 | 200 | 2 | 1 |
| 2 | 200 | 2 | 3 |
| 3 | 250 | 3 | 3 |
| 4 | 120 | 4 | 4 |
| 5 | 100 | 5 | 5 |
+---------+-------------+--------------+--------+

"information"
+---------+-------------+--------------+--------+
| Information_id | course | length | cost |
+---------+-------------+--------------+--------+
| 1 | Mysql | 15 | 259 |
| 2 | math | 12 | 200 |
| 3 | lang c++ | 15 | 250 |
| 4 | Physic | 10 | 120 |
| 5 | Chemistery | 9 | 100 |
+---------+-------------+--------------+--------+

"stud"
+---------+-------------+--------------+--------+
| Stud_id | Snf | School | Class |age|Telephone|
+---------+-------------+--------------+--------+
| 1 | Kumaraku.n.s| Shote-galica | 5 |11|2620000|
| 2 | Xhumari.e.h | Shote-galica| 4 |10|2560000|
| 3 | bendo.b.i | Shote-galica | 6 |12|6983264|
| 4 | zeneli.d.h | Shote-galica | 3 |9|3264475|
| 5 | sinjari.p.k | Shote-galica | 2 |8|3256481|
+---------+-------------+--------------+--------+

est eshye tablitsya prepodavateley no ona sdes ne vliyaet so vsem )

vedro-compota's picture

ок. сейчас попробую - только - напиши названия таблиц над каждой (edit ипользую)
это получается в запросе придётся ещё и 10 процентов считать....ну попробуем..
всё! я понял твоё первое сообщение - одной таблицы достаточно))) ты прав)

_____________
матфак вгу и остальная классика =)

Croatoan's picture

ya maladets )

vedro-compota's picture

Итак, общий синтаксис команды Update таков

Сейчас попробую написать твой запрос....

_____________
матфак вгу и остальная классика =)

Croatoan's picture

da ya znayu obshij nu priidyetsya podzaprosami polzovatsya mne kazhetsya .

vedro-compota's picture

Пробуй так =

UPDATE infostud AS t1  SET cost_certificate=(cost_certificate- cost_certificate*0.1)
 WHERE t1.id_id_stud = 
(SELECT id_id_stud  from infostud  GROUP BY id_id_stud WHERE HAVING COUNT(*)>=2)

Более подробно читай "источники" (внизу)

_____________________________________________
Источники(читать подробнее)=
http://fkn.ktu10.com/?q=node/469
http://fkn.ktu10.com/?q=node/470

____________________________________
Ключевые слова и фразы(для поиска)=
"infostud"
+-----------+---------------+----------------+-----------+
| Infostud_id | cost_certificate | id_id_information | id_id_stud |

_____________
матфак вгу и остальная классика =)

Croatoan's picture

Error Code: 1093. You can't specify target table 't1' for update in FROM clause

vedro-compota's picture

ага, значит нельзя update нельзя с псевдонимом, ну давай тогда без него =

UPDATE infostud   SET cost_certificate=(cost_certificate- cost_certificate*0.1)
 WHERE id_id_stud = 
(SELECT id_id_stud  from infostud  GROUP BY id_id_stud WHERE HAVING COUNT(*)>=2)
_____________________________________________
Источники(читать подробнее)=


Having MySQL

where count mysql
____________________________________
Ключевые слова и фразы(для поиска)=

_____________
матфак вгу и остальная классика =)

Croatoan's picture

Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE HAVING COUNT(*)>=2)' at line 3

nelzya pomoemu where having vmeste. daje esli ubiraem where vsye ravno e rabotaet pishet :Error Code: 1093. You can't specify target table 'infostud' for update in FROM clause

Croatoan's picture

luchshe pobrobuem select snachalo a potom obnoblenie

vedro-compota's picture

да конечно!!!!!!!!! я совсем уже............ так=

UPDATE infostud   SET cost_certificate=(cost_certificate- cost_certificate*0.1)
 WHERE id_id_stud =
(SELECT id_id_stud  from infostud  GROUP BY id_id_stud  HAVING COUNT(*)>=2);

________________________

_____________
матфак вгу и остальная классика =)

Croatoan's picture

apyat zhe :Error Code: 1093. You can't specify target table 'infostud' for update in FROM clause

vedro-compota's picture

ищу решение...может псевдоним назначим....ща

_____________
матфак вгу и остальная классика =)

Croatoan's picture

nelzya snachalo obnovit i potom selektirovat. nado snachalo vibirat a potom obnovlyat.

vedro-compota's picture

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

_____________
матфак вгу и остальная классика =)

Croatoan's picture

davaj klass pokaji ;)

vedro-compota's picture

В нашем случае надо пробовать так =

UPDATE infostud   SET cost_certificate=(cost_certificate- cost_certificate*0.1)
 WHERE id_id_stud =
( SELECT id_id_stud  FROM 
     (  SELECT id_id_stud FROM  infostud  GROUP BY id_id_stud  HAVING COUNT(*)>=2 )
            ) ;

давай - может чуть-чуть что-то исправить придётся .

_____________
матфак вгу и остальная классика =)

Croatoan's picture

Error Code: 1248. Every derived table must have its own alias

vedro-compota's picture

ага ))) теперь хочет псевдоним для временной таблицы , ну давай - не будем обижать СУБД =

UPDATE infostud   SET cost_certificate=(cost_certificate- cost_certificate*0.1)
 WHERE id_id_stud =
( SELECT id_id_stud  FROM
     (  SELECT id_id_stud FROM  infostud  GROUP BY id_id_stud  HAVING COUNT(*)>=2 ) AS Temp_Table
            ) ;

_____________
матфак вгу и остальная классика =)

vedro-compota's picture

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

_____________
матфак вгу и остальная классика =)

Croatoan's picture

net tut vsye prekrasno srabotal :)) ya tebe obyasnil chto poprasil snyat odnu galochku na sql editor i vsye :)

Croatoan's picture

dadadadadadaddadadadadadadda ti voooobshe krutoj :))
snachalo koe chto poprasil snyat po pravilam bezopasnosti snyal i vsye otlichno srabotal:))
bigg thnxxxx

vedro-compota's picture

да ну! должна была быть ошибка....мы же здесь =

SELECT id_id_stud  from infostud  GROUP BY id_id_stud WHERE HAVING COUNT(*)>=2

больше чем одну строку выбираем!!!
СТОП!!!
сколько студентов у тебя получилось???? один да?
если один - то тогда понятно почему работает!! -
добавь второго и будет ошибка!!!

_____________
матфак вгу и остальная классика =)

Croatoan's picture

v smisle gde dobavit eshye 1 student?

vedro-compota's picture

сколько студентов в ответе?
если один - то это значит , что работает только потому, что один!

добавь ещё кого-нибудь, кто ходит на два предмета!

сейчас я напишу правильный вариант - а ты пока добавь ещё одного!

_____________
матфак вгу и остальная классика =)

Croatoan's picture

ok

vedro-compota's picture

короче - просто сделай так чтобы этот запрос вернул двух студентов

-
и ты увидишь - полезет ошибка - типа =

more that 1 row

_____________
матфак вгу и остальная классика =)

Croatoan's picture

ti prav (( oshibka voznikaet

vedro-compota's picture

так.... попробуем назначить псевдоним столбцу, через который мы связываемся с подзапросом , попробуй так (это врят ли сработает, но интересно)
1 вариант =

UPDATE infostud   SET cost_certificate=(cost_certificate- cost_certificate*0.1)
 WHERE id_id_stud AS MyId =
( SELECT id_id_stud  FROM
     (  SELECT id_id_stud FROM  infostud  GROUP BY id_id_stud WHERE  id_id_stud=MyId  HAVING COUNT(*)>=2 ) AS Temp_Table
            ) ;

напиши ошибку какую даст!

_____________
матфак вгу и остальная классика =)