parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Задачка...

Givi 31.07.2002 21:20

Есть некая таблица items в базе, с полями:
items
item_id >> item_title >> item_type_id >> item_brand_id
И ещё есть две таблицы - types и brands вот с такой структурой:
types
type_id >> type_name

brands
brand_id >> brand_name
Никак не соображу, что нужно сделать, чтобы с минимальными затратами памяти проставить в таблицу items значения item_type_id и item_brand_id. Алгоритм нахождения соответствий следующий - если значение type_name или brand_name таблиц types или brands, соответственно, содержиться в поле item_title таблицы items, то должны быть проставлены соответствующие айдишники. Пробую это делать вот таким макаром:
@BTUpdate[]
$updtTable[^table::sql{
	SELECT 
		item_id,
		item_title
	FROM items
}]
^updtTable.menu{
	^void:sql{
		UPDATE items
		SET
			item_brand_id='^getBrandId[$updtTable.item_title]',
			item_type_id='^getTypeId[$updtTable.item_title]'
		WHERE item_id='$updtTable.item_id'
	}
}
$updtTable[]

@getTypeId[sString]
$typeT[^table::sql{
	SELECT
		type_id,
		type_name
	FROM types
}]
^typeT.menu{
	^if(^sString.match[$typeT.type_name][gi]){
		$result[$typeT.type_id]
	}
}
^if(!def $result){$result[0]}

@getBrandId[sString]
$brandT[^table::sql{
	SELECT
		brand_id,
		brand_name
	FROM brands
}]
^brandT.menu{
	^if(^sString.match[$brandT.brand_name][gi]){
		$result[$brandT.brand_id]
	}
}
^if(!def $result){$result[0]}
Ну, вызывается ^BTUpdate[]. Пока записей в types и brands не очень много (3-4), всё рулит, если больше, то вылезает out of pool memory: failed to allocate 64 bytes; already allocated on pool: 12385140 bytes in 393660 times. В таблице items порядка 1000-1500 записей. Я так полагаю, что в принципе это можно сделать средствами MySQL, только вот не знаю как :(( Подскажите плиzzz что-нибудь...