SA-MP Forums

Go Back   SA-MP Forums > Non-English > Languages > Русский/Russian

Reply
 
Thread Tools Display Modes
Old 20/02/2014, 12:50 PM   #1
Urukhay
Gangsta
 
Join Date: Sep 2013
Posts: 639
Reputation: 2
Default Супер изъятие данных или двумерный запрос.

Здравствуйте, друзья. Очередной вопрос, связанный с запросами и всеми любимой базой хранения данных MySQL. Задачу я попробую объяснить при помощи графика (в самом низу).
Цель задачи: Извлечь все строки таблицы "людей", попутно извлекая к каждому индивиду (по ключу) его одежду, строк которой может быть до 10.
На рисунке ниже мы видим 2 больших круга. Красный - таблица с одеждой, зеленый - с людьми.
Из каждой строчки таблицы "людей" должен каким-либо способом отходить "подзапрос", дабы извлечь его одежду. Таким образом, грубо говоря, можно лицезреть двумерный запрос.
Я нашёл 2 способа решения задачи, верней полтора. Вообще способов уйма, главное найти оптимальнейший, засим и спрашиваю Вас, уважаемые любители посидеть за языком Pawn.
Итак первый способ: Сначала извлекаем все строки из таблицы "людей", идем обрабатывать кэш.. При обработке, запускаем цикл (итерация = строка таблицы "людей"). И тут то и наступает момент истины, в каждой итерации мы делаем еще один "мини запрос" на извлечение уже одежды к этой строке "людей", и тут опять загвоздка, сможет ли сдружиться сервер с такой задачей? Как к этому отнесется однопоточность? Очистится ли предыдущий кэш, для обработки "мини запроса"?
Теперь второй способ. Он заключается в том, чтобы совершенно отдельно, в другой функции извлекать потом эту "одежду".
Возможно Вы сможете предложить проводить двумерность прямо в запросе? Вообщем, жду отзывов и советов.
Attached Images
File Type: png Безымянный.PNG (40.4 KB, 69 views)
Urukhay is offline   Reply With Quote
Old 20/02/2014, 02:11 PM   #2
Stepashka
Godfather
 
Stepashka's Avatar
 
Join Date: Jul 2008
Location: near PC
Posts: 5,761
Reputation: 142
Default Re: Супер изъятие данных или двумерный запрос.

Это можно сделать одним запросом, но вы потом замучаетесь парсить эти данные в pawn, поэтому вариант у вас один, получить пользователей, а уж потом, по мере необходимости, получать одежду. Обратите внимание что не надо получать данные сразу и хранить их в моде, получайте данные только тогда когда они вам нужны!
__________________
Клятва Страуструпа: "Я обязуюсь прилежно комментировать свой код, не использовать goto и следить за состоянием своих потоков и выделяемой памяти. Я обязуюсь не оставлять мусора в системе и избегать однобуквенных переменных. Ресет." © Куч
M&M GM
Status: ON HOLD

Stepashka is offline   Reply With Quote
Old 20/02/2014, 02:45 PM   #3
OKStyle
High-roller
 
OKStyle's Avatar
 
Join Date: May 2008
Location: Russia, Orenburg Money: GTA$ 999,999,999
Posts: 3,125
Reputation: 142
Default Re: Супер изъятие данных или двумерный запрос.

Quote:
Originally Posted by Urukhay View Post
всеми любимой базой хранения данных MySQL.
Я бы взял эту фразу в кавычки... Я её терпеть не могу =)
__________________
O.K.Style™ Laboratory
Kalcor: "... it's makes the game look like it's not GTA. This mod is called San Andreas Multiplayer. It's not a custom game engine which you can script..."
OKStyle is offline   Reply With Quote
Old 20/02/2014, 02:55 PM   #4
Urukhay
Gangsta
 
Join Date: Sep 2013
Posts: 639
Reputation: 2
Default Re: Супер изъятие данных или двумерный запрос.

Quote:
Originally Posted by Stepashka View Post
Это можно сделать одним запросом, но вы потом замучаетесь парсить эти данные в pawn, поэтому вариант у вас один, получить пользователей, а уж потом, по мере необходимости, получать одежду. Обратите внимание что не надо получать данные сразу и хранить их в моде, получайте данные только тогда когда они вам нужны!
Значит, отправлю 2 отдельных запроса в отдельных функциях. И парсить удобнее, и мороки меньше.
Urukhay is offline   Reply With Quote
Old 23/02/2014, 05:19 PM   #5
sent161
Little Clucker
 
Join Date: Aug 2010
Location: Russian
Posts: 46
Reputation: 0
Default Re: Супер изъятие данных или двумерный запрос.

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

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


PHP Code:
                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
                            
);
                        }
                    }
                } 
__________________
sent161 is offline   Reply With Quote
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Грамотный запрос MySQL. Urukhay Русский/Russian 3 10/01/2014 05:14 AM
Проблема с мускулом (запрос) Ted67 Русский/Russian 11 15/12/2013 08:22 AM
MySQL запрос Seregamil1 Русский/Russian 10 22/07/2013 12:47 PM
Поиск/запрос приватного скрипта ZaR Русский/Russian 12 29/05/2010 10:15 AM


All times are GMT. The time now is 04:14 PM.


Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.