Супер изъятие данных или двумерный запрос.
#1

Здравствуйте, друзья. Очередной вопрос, связанный с запросами и всеми любимой базой хранения данных MySQL. Задачу я попробую объяснить при помощи графика (в самом низу).
Цель задачи: Извлечь все строки таблицы "людей", попутно извлекая к каждому индивиду (по ключу) его одежду, строк которой может быть до 10.
На рисунке ниже мы видим 2 больших круга. Красный - таблица с одеждой, зеленый - с людьми.
Из каждой строчки таблицы "людей" должен каким-либо способом отходить "подзапрос", дабы извлечь его одежду. Таким образом, грубо говоря, можно лицезреть двумерный запрос.
Я нашёл 2 способа решения задачи, верней полтора. Вообще способов уйма, главное найти оптимальнейший, засим и спрашиваю Вас, уважаемые любители посидеть за языком Pawn.
Итак первый способ: Сначала извлекаем все строки из таблицы "людей", идем обрабатывать кэш.. При обработке, запускаем цикл (итерация = строка таблицы "людей"). И тут то и наступает момент истины, в каждой итерации мы делаем еще один "мини запрос" на извлечение уже одежды к этой строке "людей", и тут опять загвоздка, сможет ли сдружиться сервер с такой задачей? Как к этому отнесется однопоточность? Очистится ли предыдущий кэш, для обработки "мини запроса"?
Теперь второй способ. Он заключается в том, чтобы совершенно отдельно, в другой функции извлекать потом эту "одежду".
Возможно Вы сможете предложить проводить двумерность прямо в запросе? Вообщем, жду отзывов и советов.
Reply
#2

Это можно сделать одним запросом, но вы потом замучаетесь парсить эти данные в pawn, поэтому вариант у вас один, получить пользователей, а уж потом, по мере необходимости, получать одежду. Обратите внимание что не надо получать данные сразу и хранить их в моде, получайте данные только тогда когда они вам нужны!
Reply
#3

Quote:
Originally Posted by Urukhay
Посмотреть сообщение
всеми любимой базой хранения данных MySQL.
Я бы взял эту фразу в кавычки... Я её терпеть не могу =)
Reply
#4

Quote:
Originally Posted by Stepashka
Посмотреть сообщение
Это можно сделать одним запросом, но вы потом замучаетесь парсить эти данные в pawn, поэтому вариант у вас один, получить пользователей, а уж потом, по мере необходимости, получать одежду. Обратите внимание что не надо получать данные сразу и хранить их в моде, получайте данные только тогда когда они вам нужны!
Значит, отправлю 2 отдельных запроса в отдельных функциях. И парсить удобнее, и мороки меньше.
Reply
#5

Код правда на C++, но думаю будет полезен.
Сперва мы загружаем наших игроков; Потом, этим запросом загружаем их одежду

Переменные:
slot - ид дерева
fell - ид слота, в данном случае - лесопилки


PHP код:
                void loadTrees()
                {
                    
int slot 0;
                    
int fell 0;
                    
MYSQL_ROW row;
                    
//----------------------------------------------//
                    
if ( mysql_query(con"SELECT * FROM feller_trees ORDER BY owner") )
                    {
                        
logprintf("[FellerTrees] : query error: %s"mysql_error(con));
                    }
                    else
                    {
                        
MYSQL_RES *result mysql_store_result(con);
                        
//----------------------------------------------//
                        
while ( ( row mysql_fetch_row(result) ) )
                        {
                            if ( 
fell == atoi(row[1]) - && slot MAX_TREES_PER_FELLER slot++;
                            else
                            {
                                
fell atoi(row[1]) - 1;
                                
slot 0;
                            }
                            
//````````````````//
                            
Feller[fell].Trees[slot].db            atoi(row[0]);
                            
Feller[fell].Trees[slot].Type        atoi(row[2]);
                            
Feller[fell].Trees[slot].Pos.X        atof(row[3]);
                            
Feller[fell].Trees[slot].Pos.Y        atof(row[4]);
                            
Feller[fell].Trees[slot].Pos.Z        atof(row[5]);
                            
Feller[fell].Trees[slot].Health        atoi(row[6]);
                            
//````````````````//
                            
Feller[fell].Trees[slot].obj StreamerCall::Native::CreateDynamicObject
                            
(
                                
656,
                                
Feller[fell].Trees[slot].Pos.X,
                                
Feller[fell].Trees[slot].Pos.Y,
                                
Feller[fell].Trees[slot].Pos.TREE_OFFSET,
                                
0.0f0.0f0.0f00
                            
);
                            
//----------------------------------------------//
                            
StreamerCall::Native::MoveDynamicObject
                            
(
                                
Feller[fell].Trees[slot].obj,
                                
Feller[fell].Trees[slot].Pos.X,
                                
Feller[fell].Trees[slot].Pos.Y,
                                
Feller[fell].Trees[slot].Pos.ZTREE_SPEED
                            
);
                        }
                    }
                } 
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)