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