LINUX.ORG.RU

pg_query -> mysql_query, need help


0

0

есть таблица в базе данных (уже передланая под mysql)

create table user_session( id int unsigned auto_increment not null primary key, ascii_session_id char(32), logged_in bool default false, user_id int unsigned, last_impression timestamp, created timestamp, user_agent varchar(256) ); create table session_variable ( id int unsigned auto_increment not null primary key, session_id int unsigned, variable_name varchar(64), variable_value text );

как вы видете работа идет с сессими

есть запрос к этой базе, вида, на pgsql: sql = "DELETE FROM \"user_session\" WHERE (ascii_session_id = "$this->php_session_id ") OR (NOW() - (SELECT created FROM user_session ) > $this->session_timeout ";

но если я его просто вставляю в mysql, то в результате выходит ошибка DELETE FROM user_session WHERE (ascii_session_id = '3ee94f51f37fdb8081b5692f3558fa99') OR (NOW() - (SELECT created FROM user_session ) > 600) HY000, You can't specify target table 'user_session' for update in FROM clause вообщем то ни как не могу разобратся с этим запросом, кто может, хелп, буду очень признателен


Первое: переписываем запрос с отступами 
sql = "
  DELETE FROM \"user_session\" 
  WHERE 
   (ascii_session_id = "$this->php_session_id ") OR
   (NOW() - (SELECT created FROM user_session ) > 
     $this->session_timeout ";

и видим что скобки не сбалансированы: Вот эта скобка -> (NOW  нигде не закрывается


Второе: смотрим на кусок WHERE:

(SELECT created FROM user_session ) > $this->session_timeout 

это действительно в Postgres работает? Какое оно имеет значение если в user_session более одной записи? 

gods-little-toy ★★★
()

А! у тебя скобки на самом деле-то сбалансированы:

DELETE FROM user_session 
WHERE 
  (ascii_session_id = '3ee94f51f37fdb8081b5692f3558fa99') OR 
  (NOW() - (SELECT created FROM user_session ) > 600)

Но вопрос про сабселект остается... Может ты имел ввиду:

DELETE FROM user_session 
WHERE 
  (ascii_session_id = '3ee94f51f37fdb8081b5692f3558fa99') OR 
  (NOW() - created > 600)

?

gods-little-toy ★★★
()
Ответ на: комментарий от gods-little-toy

Еще пара мыслей:

1. Если у тебя есть индексы на created и ascii_session_id, то не надо удалять заданную сессию и чистить старые одним запросом. Ты провоцируешь полный скан таблицы. Лучше используй два отделных DELETE:

mysql_query("DELETE ...; DELETE ...");

2. То, на что ты наткнулся - известное ограничение MySQL. Если тебе *действительно* нужен подзапрос, стандартная метода обхода такая:

SET @var= (SELECT ... FROM user_session WHERE ...);

DELETE FROM user_sssion WHERE ... @var ... ;

gods-little-toy ★★★
()
Ответ на: комментарий от gods-little-toy

> http://media.wiley.com/product_ancillary/22/07645728/DOWNLOAD/ProPHP5Code.zip - исходный код, chapter 15

еще раз таблицы с отступами

create table user_session(
id int unsigned auto_increment not null primary key,
ascii_session_id char(32),
logged_in bool default false,
user_id int unsigned,
last_impression timestamp,
created timestamp,
user_agent varchar(256)
);

create table session_variable (
id int unsigned auto_increment not null primary key,
session_id int unsigned,
variable_name varchar(64),
variable_value text
);

а с запросом да, я ошибся там стоит NOW() - created.

> SET @var= (SELECT ... FROM user_session WHERE ...);
> DELETE FROM user_sssion WHERE ... @var ... ;

т.е. мне нужно сделать
SET @var = ( SELECT created FROM user_session );
DELETE FROM user_session WHERE (NOW() - @var) < $this->lifetime ?

огромное спасибо за помощь

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

1. Давай ссылки поточнее... file X, lines Y-Z.

я там вижу только вот это: "usersession.phpm", line 33:

# Delete from database - we do garbage cleanup at the same time $result = pg_query("DELETE FROM \"user_session\" WHERE (ascii_session_id = '". $this->php_session_id . "') OR (now() - created) > $maxlifetime)"); # Clean up stray session variables $result = pg_query("DELETE FROM \"session_variable\" WHERE session_id NOT IN (SELECT id FROM \"user_session\")"); # Get rid of this one... this will force PHP to give us another

то есть

DELETE FROM \"user_session\" WHERE (ascii_session_id = '". $this->php_session_id . "') OR (now() - created) > $maxlifetime)");

Без подзапроса. Второй запрос:

DELETE FROM \"session_variable\" WHERE session_id NOT IN (SELECT id FROM \"user_session\")");

две разных таблицы тут.

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