Page 3 of 3

Re: MySQL place

Posted: 2011 Oct 16 00:36
by morka
Galimas ir toks variantas

SELECT COUNT(*) FROM kzkas WHERE SteamID = STEAM:0.0.1 ORDER BY Kills ASC LIMIT 1

Re: MySQL place

Posted: 2011 Oct 16 00:43
by addinol
Bet čia su šita sintakse būtų uždelsimas kažkoks vistiek ?

Re: MySQL place

Posted: 2011 Oct 16 12:08
by hleV
addinol wrote:Bet čia su šita sintakse būtų uždelsimas kažkoks vistiek ?
Tavo atveju šito tikrai nereikia, nes kintamasis Entries reikalingas nustatyti kiekvieno SteamID poziciją, o tada jį panaudoji dar ir visų įrašų skaičiui gauti.
Aš apskritai nesu mėgėjas kažką dažnai užkraut iš MySQL duombazės, verčiau užkraut viską žemėlapio pradžioj, viską sudėt į dinaminę atmintį (Array, Trie, nes jie yra nuostabūs ^^), galbūt kas kažkiek laiko išsaugot dabartinius duomenis į MySQL (apsisaugojant nuo duomenų neišsisaugojimo serveriui nulūžus) ir viską išsaugot žemėlapio pabaigoje. Nors nežinau kaip ten būtų su tuo kelių tūkstančių įrašų išsaugojimu į MySQL per vieną užklausą. Reiks pabandyt.
ArraySort() dirba žiauriai greitai, nežinau ar MySQL variantas geresnis, bet abu variantai ganėtinai geri, kadangi viskas thread'inama.

Re: MySQL place

Posted: 2011 Oct 17 20:17
by addinol
hleV, o kaip dabar padaryti, jog tarkim jei noriu atvaizduoti kas yra 1, ..., 5 vietoj, jo nicką ir skill reiktų atvaizduoti, Skill yra paimtas iš vienos lentelės nick yra iš kitos lentelės, abi lentelės turi žaidėjo IP.

Re: MySQL place

Posted: 2011 Oct 17 21:55
by hleV
Top 5 (ar kiek tau reikia) gali gaut per tą pačią UpdateRank užklausą, sudėdamas pirmų 5 (ar belekiek) žaidėjų duomenis (nick ir skill) į Array. Tik aišku SQL užklausoj reikia ten dadėt kad select'intų nick ir skill.

Re: MySQL place

Posted: 2011 Oct 17 22:03
by addinol
Štai taip turėtų atrodyti SQL užklausa.

Code: Select all

    SQL_ThreadQuery(g_SqlTuple, "OnUpdateTop", "SELECT pName, pSkill FROM pMain JOIN pStats ON pMain.pIp=pStats.pIp ORDER BY pStats.pSkill DESC"); 
O kaip toliau daryti ?

tarkim OnUpdateTop:

Code: Select all

public OnUpdateTop(failState, Handle:query, error[], errorCode){    if (errorCode)        set_fail_state(error);     new szName[33], szSkill;     while (SQL_MoreResults(query))    {        SQL_ReadResult(query, 0, szName, charsmax(szName));        szSkill = SQL_ReadResult(query, 1)        TrieSetCell(Tops, szName);                SQL_NextRow(query);    }}
Išvis nesuprantu kaip tie Trie veikia, kaip į juos įsaugot dvi reikšmes į vieną, t.y. ir szName ir szSkill.

Re: MySQL place

Posted: 2011 Oct 17 22:04
by hleV

Code: Select all

#define MAX_TOP 5 enum _:TOP{    TOP_NAME[32],    TOP_SKILL}; new Array:Top; public plugin_init()    Top = ArrayCreate(TOP);

Code: Select all

 ArrayClear(Top); new top[TOP]; while (SQL_MoreResults(query)){    SQL_ReadResult(query, 0, steamId, charsmax(steamId));    TrieSetCell(Positions, steamId, Entries++);     if (Entries <= MAX_TOP)    {        // Cia su salyga kad select'ini tokiu principu: SteamID, Nick, Skill        SQL_ReadResult(query, 1, top[TOP_NAME], charsmax(top[TOP_NAME]));         top[TOP_SKILL] = SQL_ReadResult(query, 2);         ArrayPushArray(Top, top);    }         SQL_NextRow(query);}
Kad gaut kažkelintą žaidėją:

Code: Select all

new top[TOP];ArrayGetArray(Top, 0, top); // 0 - tai pirmas top'eclient_print(0, print_chat, "* Pirmas tope yra %s su %d skill'u.", top[TOP_NAME], top[TOP_SKILL]);
Su Trie irgi tokiu pat principu gali išsaugot kelias reikšmes, BET!!! TrieGetArray() ar TrieSetArray() yra susibuginęs 1.8.1 versijoj, tad jei nori tai daryt, teks naudot 1.8.2 (dev build).

Re: MySQL place

Posted: 2011 Oct 17 22:40
by addinol
Plugin says: Column 'pIp' in field list is ambiguous

Code: Select all

SQL_ThreadQuery(g_SqlTuple, "OnUpdateRank", "SELECT pIp, pName, pSkill FROM pMain LEFT JOIN pStats ON pMain.pIp=pStats.pIp ORDER BY pStats.pSkill DESC");
Susitvarkiau: pMain.pIp