Обновление нескольких строчек одним запросом

Emeron

Новичок
Здравствуйте. Существует две таблицы, в каждой из ней есть по 2 поля: author_id и pos, в обеих таблицах значения столбца author_id одинаковы соответственно, но значения столбца pos разные. Каким одним MySQL запросом можно заменить все значения pos одной таблицы значениями из другой только там, где будут одинаковы author_id?
 

iceman

говнокодер
> но значения столбца pos разные.

а зачем тебе тогда pos в двух таблицах? нормальзируй бд...
 

Emeron

Новичок
> но значения столбца pos разные.

а зачем тебе тогда pos в двух таблицах? нормальзируй бд...
Вторая таблица формируется из нужных данных, также она временная и нужна для того, чтобы обновить pos первой таблицы, после чего временная таблица удаляется.
Перед тем, как писать сюда, я уже смотрел информацию об этих операторах, но так нужного мне и не нашел, иначе бы я не писал...
 

Вурдалак

Продвинутый новичок
По первой же ссылке (оф. мануал) есть примеры. Как в статье, так и в комментариях. В статье правда вместо JOIN используется оператор запятая, что по сути одно и то же.

UPDATE items,month SET items.price=month.price
WHERE items.id=month.id;
 

Emeron

Новичок
Я пробовал запрос такого типа, но возвращало вот такую ошибку(пример ошибки показан на вашем примере):

Unknown column 'month.id' in 'where clause'
 

iceman

говнокодер
перевести ошибку не судьба? напряч мозги и попробовать понять что за ошибка?!
 

Emeron

Новичок
Что это решает?

Я специально создал таблицу под запрос выше, затем произвел этот запрос и вышла ошибка выше, т.е. столбец не был найден.
 

Вурдалак

Продвинутый новичок
М-да. Если столбец был не найден, значит логично, что таблицу ты создал неверно.
 

Emeron

Новичок
Как раз наоборот, при обращении не к адресу таблица.столбец, а локально к столбцу, запросы работают отлично, но таблицы то две, в этом то и вся проблема.
 

Emeron

Новичок
Структура первой таблицы:

Код:
CREATE TABLE IF NOT EXISTS `table` (
`id` int(15) auto_increment,
`author_id` int(15) default NULL,
`pos` int(25) default '0',
`points` int(25) default '0',
PRIMARY KEY  (`id`),
UNIQUE KEY `author_id` (`author_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
Сам скрипт, создающий вторую таблицу и выполняющий запрос:

Код:
<?php

$db_host="localhost";
$db_user="root";
$db_password="pass";
$db_name = "database";
$table = "table";

mysql_connect( $db_host, $db_user, $db_password );
mysql_select_db( $db_name );
mysql_query( "SET NAMES 'utf8'" );

$apps = mysql_query( "SELECT `author_id` FROM `".$table."` ORDER BY `points` DESC" );

$apps_top = array();
$app_num = 0;
while($current_app = mysql_fetch_array($apps))
{
	$apps_top[$app_num] = $current_app['app_id'];
	$app_num ++;
}

$temporary_table = "CREATE TEMPORARY TABLE IF NOT EXISTS `temporary_top` (";
$temporary_table .= "`id` int(15) auto_increment,";
$temporary_table .= "`author_id` int(15) default NULL,";
$temporary_table .= "`pos` int(25) default '0',";
$temporary_table .= "PRIMARY KEY  (`id`),";
$temporary_table .= "UNIQUE KEY `author_id` (`author_id`)";
$temporary_table .= ") ENGINE=MyISAM  DEFAULT CHARSET=utf8; ";

$temporary_table .= "INSERT INTO `temporary_top` (`author_id`, `pos`) VALUES ";
for($i = 0; $i < count($apps_top); $i ++)
{
	if($i != count($apps_top) - 1)
	{
		$temporary_table .= "('" . $apps_top[$i] . "','" . ($i + 1) . "'),";
	}
	else
	{
		$temporary_table .= "('" . $apps_top[$i] . "','" . ($i + 1) . "'); ";
	}
}

$query = "UPDATE ".$table." JOIN `temporary_top` SET ".$table.".`pos` = temporary_top.`pos` WHERE ".$table.".`author_id` = temporary_top.`author_id`;";

//Тест
echo $temporary_table . "<br>";
echo $query . "<br><br>";

mysql_query($temporary_table.$query) or die ( "Ошибка: ".mysql_error());
?>
 

Вурдалак

Продвинутый новичок
1. Почитай о запросе
Код:
INSERT INTO ... SELECT ...

2. JOIN замени на запятую.

3. mysql_query() выполняет только один запрос.

P.S. fetch_array() вообще бы задеприкейтить.
 

Emeron

Новичок
Большое спасибо! Особенно за совет по mysql_query().
P.S. что именно вам не понравилось в fetch_array()?
 
Сверху