1

Тема: MySQL, допоможіть побудувати круту процедуру

Прів. Таке діло. Є табличка login_t з полями id, login,password, state. Тре така процедура -
на вхід отримуємо log & pass. Перевіряємо, якщо є така комбінація з log & pass, то змінюємо значення поля state на 1, в тій стрічці, де login=log і вибираємо id з строки, де login=log. В мене був код, котрий просто перевіряє існування комбінації логіну і пароля, і вибирає id. Але от як туди додати ще й зміну state -хз. Думав, може UNION якось допоможе, але нє, не робить. Ось що вийшло.

BEGIN
SELECT IF( EXISTS(
             SELECT id
             FROM login_t
             WHERE login =  log AND password = PASSWORD(psw) AND
             (select state from login_t where login=log)=0 ), 
             (select id from login_t where login=log UNION
             update login_t SET state:=1 where login=log), 0)
ENDIF;
END

2

Re: MySQL, допоможіть побудувати круту процедуру

UPDATE login_t SET state=1 WHERE login='vasa' AND password='asav'

Ви не зможете поєднати в одному запиті кілька різнотипних: SELECT та UPDATE, наприклад.

3

Re: MySQL, допоможіть побудувати круту процедуру

Bartash написав:
UPDATE login_t SET state=1 WHERE login='vasa' AND password='asav'

Ви не зможете поєднати в одному запиті кілька різнотипних: SELECT та UPDATE, наприклад.

а як тоді поєднати різнотипні?

4

Re: MySQL, допоможіть побудувати круту процедуру

Наведу приклад на SQL Server:

CREATE PROCEDURE myFoo
@Login AS varchar,
@Password AS varchar
AS
BEGIN
DECLARE @id int;
/*Витягаємо ID юзера*/

SELECT @id=Id FROM login_t WHERE Login=@Login AND Password=@Password

IF @id IS NOT NULL
    UPDATE login_t SET State=1 WHERE Id=@id

END

Підійде?

5

Re: MySQL, допоможіть побудувати круту процедуру

Пане Трусікі, може, будете повністю завдання викладати? Бо запит пана Барташа робить те саме, що й ваша процедура, і швидше, до того ж.

6

Re: MySQL, допоможіть побудувати круту процедуру

Bartash написав:

Наведу приклад на SQL Server:

CREATE PROCEDURE myFoo
@Login AS varchar,
@Password AS varchar
AS
BEGIN
DECLARE @id int;
/*Витягаємо ID юзера*/

SELECT @id=Id FROM login_t WHERE Login=@Login AND Password=@Password

IF @id IS NOT NULL
    UPDATE login_t SET State=1 WHERE Id=@id

END

Підійде?

ну тут не все. Тут же як. Якщо комбінація існує, то ставим 1. А тре - Якщо комбінація існує і state=0, то робимо state:=1 і вибираємо id. А якщо комбінація існує і state=1 то повертаємо 0.

7

Re: MySQL, допоможіть побудувати круту процедуру

koala написав:

Пане Трусікі, може, будете повністю завдання викладати? Бо запит пана Барташа робить те саме, що й ваша процедура, і швидше, до того ж.

да мені так важко думати зара, це капець. В 6 ранку прокинувся, а я дуже сова. Тому допізна не сплю і якщо тре рано вставати, то цілий день вбитий і не дієздатний.

8

Re: MySQL, допоможіть побудувати круту процедуру

DECLARE @state int;
SELECT @id=Id,@state=state FROM login_t WHERE Login=@Login AND Password=@Password
 
IF @id IS NOT NULL AND @state=0
    UPDATE login_t SET State=1 WHERE Id=@id

да мені так важко думати зара, це капець. В 6 ранку прокинувся, а я дуже сова. Тому допізна не сплю і якщо тре рано вставати, то цілий день вбитий і не дієздатний.

Не виправдання. Особливо, якщо ви - студент.

9

Re: MySQL, допоможіть побудувати круту процедуру

UPDATE login_t SET state=1 WHERE login='vasa' AND password='asav' AND state='0'

Якщо існує - все ок; якщо не існує або state=1 - повертає 0.

Подякували: FakiNyan2

10

Re: MySQL, допоможіть побудувати круту процедуру

Bartash написав:
DECLARE @state int;
SELECT @id=Id,@state=state FROM login_t WHERE Login=@Login AND Password=@Password
 
IF @id IS NOT NULL AND @state=0
    UPDATE login_t SET State=1 WHERE Id=@id

да мені так важко думати зара, це капець. В 6 ранку прокинувся, а я дуже сова. Тому допізна не сплю і якщо тре рано вставати, то цілий день вбитий і не дієздатний.

Не виправдання. Особливо, якщо ви - студент.

я ж не тєрмінатор!!!

11

Re: MySQL, допоможіть побудувати круту процедуру

TRYCUKI_V_KROVI написав:
Bartash написав:
DECLARE @state int;
SELECT @id=Id,@state=state FROM login_t WHERE Login=@Login AND Password=@Password
 
IF @id IS NOT NULL AND @state=0
    UPDATE login_t SET State=1 WHERE Id=@id

да мені так важко думати зара, це капець. В 6 ранку прокинувся, а я дуже сова. Тому допізна не сплю і якщо тре рано вставати, то цілий день вбитий і не дієздатний.

Не виправдання. Особливо, якщо ви - студент.

я ж не тєрмінатор!!!

Який курс?

12

Re: MySQL, допоможіть побудувати круту процедуру

Bartash написав:
TRYCUKI_V_KROVI написав:
Bartash написав:
DECLARE @state int;
SELECT @id=Id,@state=state FROM login_t WHERE Login=@Login AND Password=@Password
 
IF @id IS NOT NULL AND @state=0
    UPDATE login_t SET State=1 WHERE Id=@id

Не виправдання. Особливо, якщо ви - студент.

я ж не тєрмінатор!!!

Який курс?

не скажу.

13 Востаннє редагувалося Cyan (08.07.2013 22:00:48)

Re: MySQL, допоможіть побудувати круту процедуру

студент повинен:
-не спати вночі. для цього є пари. і взагалі, сон для слабаків
-завжди бути готовим впарити викладачеві фігню, яку раніше зроду не бачив
-якщо впарити не виходить, то довго медитувати над конспектами, поки не дійде
-запізнюватись. особливо щодо здач. інакше він не виконав завдання, а просто намагається схалявити
-врятувати світ. двічі. за день. поки тече кетчуп

З.І. ще одне забула: робити кілька справ одночасно, інакше 24-х годин в добі буде замало

14 Востаннє редагувалося FakiNyan (09.07.2013 14:13:25)

Re: MySQL, допоможіть побудувати круту процедуру

Я тільки що спробував цю процедуру. і ніфіга вона не робить

DECLARE @state int;
SELECT @id=Id,@state=state FROM login_t WHERE Login=@Login AND Password=@Password
 
IF @id IS NOT NULL AND @state=0
    UPDATE login_t SET State=1 WHERE Id=@id

По-перше в Declare не треба @. По-друге в SELECT треба @id:=id. От, а по-трете воно не робить взагалі ніяк, тому що перший Select хоче повернути якесь значення і якщо все після нього видалити все, то так і є, повертаєтся значення id, а в іншому разі все просто тормозить і при запуску процедури просто висить табличка - "завантаження" і так цілу вічність.

15

Re: MySQL, допоможіть побудувати круту процедуру

TRYCUKI_V_KROVI написав:

Я тільки що спробував цю процедуру. і ніфіга вона не робить

DECLARE @state int;
SELECT @id=Id,@state=state FROM login_t WHERE Login=@Login AND Password=@Password
 
IF @id IS NOT NULL AND @state=0
    UPDATE login_t SET State=1 WHERE Id=@id

По-перше в Declare не треба @. По-друге в SELECT треба @id:=id. От, а по-трете воно не робить взагалі ніяк, тому що перший Select хоче повернути якесь значення і якщо все після нього видалити все, то так і є, повертаєтся значення id, а в іншому разі все просто тормозить і при запуску процедури просто висить табличка - "завантаження" і так цілу вічність.

По-нульове:

Bartash написав:

Наведу приклад на SQL Server:

Я працюю на mssql, тому не знаю напам'ять синтаксису мускула.
Не підходить варіант - візміть апдейт від koala і запишіть результат у змінну (кількість рядків, задіяних у запиті).

16

Re: MySQL, допоможіть побудувати круту процедуру

Bartash написав:
TRYCUKI_V_KROVI написав:

Я тільки що спробував цю процедуру. і ніфіга вона не робить

DECLARE @state int;
SELECT @id=Id,@state=state FROM login_t WHERE Login=@Login AND Password=@Password
 
IF @id IS NOT NULL AND @state=0
    UPDATE login_t SET State=1 WHERE Id=@id

По-перше в Declare не треба @. По-друге в SELECT треба @id:=id. От, а по-трете воно не робить взагалі ніяк, тому що перший Select хоче повернути якесь значення і якщо все після нього видалити все, то так і є, повертаєтся значення id, а в іншому разі все просто тормозить і при запуску процедури просто висить табличка - "завантаження" і так цілу вічність.

По-нульове:

Bartash написав:

Наведу приклад на SQL Server:

Я працюю на mssql, тому не знаю напам'ять синтаксису мускула.
Не підходить варіант - візміть апдейт від koala і запишіть результат у змінну (кількість рядків, задіяних у запиті).

ой xD Ну той апдейт, звичайно, нічо так. Але я трохи передумав. Воно ось як. Якщо комбінації нема, значить не вірний логін або пароль, якщо state=1, значить цей юзер вже зайшов в гру. То й думаю, було б не погано це відловлювати. Наприклад, якщо перше, то відправляємо той нуль, якщо друге, то відправляємо -1, а якщо все ОК, то відправляємо id юзера. І все було б легко, я б зробив щось типу цього

Declare user_id int;
Declare user_state int;
select @user_id:=id from login_t where login=log AND password=psw;

if user_id!=0 Then
select @user_state:=state from login_t where id=user_id;
   if user_state==0 Then
   update login_t SET state=1 where id=user_id;
   select user_id;
   ELSE
   select -1;
   ENDIF;
ELSE select 0;
ENDIF;


але синтаксис такий калічний, в одному джерелі він один, в іншому - інший, в мене матюкаєтся на будь-який синтакис і + до цього ніколи не зрозуміло в чому проблема. А ще й глюк якийсь з select'ом. Ну не може селект просто взяти і присвоїти змінній значення.