| Новости | FAQ | Авторы | Документация | В действии | Библиотека |
| Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
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 что-нибудь...