Суть такая:
1) Если NICK, ID первой таблицы совпадает с NICK, ID второй таблицы пишем ONLINE=1
2) Если во-второй таблице NICK, ID есть но не совпадает с NICK, ID первой таблицы, во-вторую таблицу пишем ONLINE=0 всем, кого НЕТ в первой таблице
3) Если есть в первой, но нет во-второй ЗАПИСЫВАЕМ.
Первое, третье понятно.. Не понятно второе ;(
Пытался так:
$mysql_query = mysql_query("SELECT
one_table.name AS one_name,
one_table.id AS one_id,
two_table.name AS two_name,
two_table.id AS two_id,
two_table.time AS two_time FROM one_table LEFT JOIN two_table");
while ($row = mysql_fetch_assoc($mysql_query))
{
$one_table_name = $row['one_name'];
$one_table_id = $row['one_id'];
$two_table_name = $row['two_name'];
$two_table_id = $row['two_id'];
$two_table_time = $row['two_time'];
$timenow = date("Y-m-d H:i:s");
// 1)
if ($one_table_name == $two_table_name && $one_table_id == $two_table_id)
{
mysql_query("UPDATE `two_table` SET `online` = '1', `time` = '{$timenow}' WHERE `name` = '{$two_table_name}' AND `id` = '{$two_table_id}'");
}
// 2)
if ()
{
mysql_query("UPDATE `two_table` SET `online` = '0' WHERE `name` = '{$two_table_name}' AND `id` = '{$two_table_id}'");
}
// 3)
if ($one_table_name != $two_table_name && $one_table_id != $two_table_id)
{
mysql_query("INSERT INTO `two_table` (pl_id, name, id, online, time) VALUES ('', '{$one_table_name}', '{$one_table_id}', '1', '{$timenow}')");
}
}
Спустя 33 минуты, 17 секунд (17.07.2010 - 17:18) uMnepaTop написал(а):
Получается так и вроде работает:
Только на 1000 записей, выполняется 9 секунд..
Помогите оптимизировать пожалуйста.. Может запрос к БД по другому или еще чего..
$mysql_query = mysql_query("SELECT
one_table.name AS one_name,
one_table.id AS one_id,
two_table.name AS two_name,
two_table.id AS two_id,
two_table.time AS two_time FROM one_table LEFT JOIN two_table ON one_table.id = two_table.id AND one_table.name = two_table.name");
while ($row = mysql_fetch_assoc($mysql_query))
{
$one_table_name = $row['one_name'];
$one_table_id = $row['one_id'];
$two_table_name = $row['two_name'];
$two_table_id = $row['two_id'];
$two_table_time = $row['two_time'];
$timenow = date("Y-m-d H:i:s");
// 1)
if ($one_table_name == $two_table_name && $one_table_id == $two_table_id)
{
mysql_query("UPDATE `two_table` SET `online` = '1', `time` = '{$timenow}' WHERE `name` = '{$two_table_name}' AND `id` = '{$two_table_id}'");
}
else // 2)
{
mysql_query("UPDATE `two_table` SET `online` = '0' WHERE `time` < '$timenow' - interval '90' SECOND");
}
// 3)
if ($one_table_name != $two_table_name && $one_table_id != $two_table_id)
{
mysql_query("INSERT INTO `two_table` (pl_id, name, id, time) VALUES ('', '{$one_table_name}', '{$one_table_id}', '{$timenow}')");
}
}
Только на 1000 записей, выполняется 9 секунд..
Помогите оптимизировать пожалуйста.. Может запрос к БД по другому или еще чего..
Спустя 2 часа, 6 минут, 52 секунды (17.07.2010 - 19:25) Reflex написал(а):
Добавить в обе таблицы индекс сразу на оба поля id + name:
Или убрать:
ALTER TABLE one_table ADD UNIQUE id_name (id, name)
ALTER TABLE two_table ADD UNIQUE id_name (id, name)
AND one_table.name = two_table.name
Спустя 26 минут, 17 секунд (17.07.2010 - 19:51) uMnepaTop написал(а):
Поставил UNIQUE на обе таблицы, на поля NAME
убрал
AND one_table.name = two_table.name
и вообще долго.. 504 (Gateway)
UPD:
Поставил UNIQUE на обе таблицы, на поля NAME
оставил
one_table.id = two_table.id AND one_table.name = two_table.name
Благодарю, теперь максимально 1 сек.)) Спс!)
убрал
AND one_table.name = two_table.name
и вообще долго.. 504 (Gateway)
UPD:
Поставил UNIQUE на обе таблицы, на поля NAME
оставил
one_table.id = two_table.id AND one_table.name = two_table.name
Благодарю, теперь максимально 1 сек.)) Спс!)
Спустя 1 час, 47 минут, 18 секунд (17.07.2010 - 21:39) Reflex написал(а):