Autor Zpráva
JardaB
Profil
Zdravím,

potřebuji nějak rozumně do své soutěžní hry virtuální rybolov navrhnout soutěžní úkoly. Data mám uložena v MySQL, obsluha dat z PHP. Záznamů je cca 500 tis. Problém je ten, že soutěžních úkolů chci mít celkem dost a nechci volat při každé akci klienta např. 100 dotazů do dtb, abych zjistit, zda některý vyhovuje splněnému úkolu. Nechci aby se úkoly musely řešit v pořadí, což by logicky usnadnilo dotazy. Napadá mě jedině rozdělit dotazy do sekcí třeba po pěti. Kdy se po splnění přesunou na další dávku úkolů. Pokud někoho z vás napadá, jak tohle řešit elegantněji, tak uvítám ... Děkuji.
Kajman
Profil
Zkuste to více popsat. Jakých 100 dotazů máte na mysli?

Pokud úkol je typu "Chytni candáta, co má metrák", tak přece můžete udělat jeden dotaz, co vrátí splněné úkoly podle parametrů úlovku (datum, druh ryby, místo, hmotnost, délka).
JardaB
Profil
Ano jak píšete, chytni Kapra, chytni Sumce atd.. poté chytni trofejní rybu nad 10 kg, chytni 100 ks cejn, nachytej 50 kg plotic atd.. Tzn. když bude takových úloh 100, musel bych mít i 100 specifických dotazů do dtb. Úkoly nejsou stejné ani podobné, aby je bylo možné zahrnout do jednoho dotazu. Některé možná, ale ne většinu. Třeba u chytání počtu kusů dané ryby by to šlo jedním dotazem.

Mno i když nyní mě napadá, že by se dal položit nějaký komplexní dotaz, který zjistí stavy, hmotnosti, chycené ryby a pak by se to porovnávalo podle podmínek v PHP. Tedy jeden dotaz a zbytek by řešilo PHP. Podmínky bych si uložil do tabulky a v případě splnění by se již nenabízely. Ve finále jeden dotaz pro celkové statistiky a druhý dotaz pro výpis podmínek nesplněných úkolů.
Tomášeek
Profil
JardaB:
Řešíš nekonkrétně konkrétní dotaz, ale neukážeš nám, co máš. Ukaž současný dotaz(y), strukturu tabulek, typ úkolů (chytni X, chytni Y, chytni Z, pořád se bavíme o tom samém, tzn. není důvod, aby to nešlo jedním dotazem).
juriad
Profil
On je možný i opačný dotaz: najdi mi všechy úkoly, které jsem ještě nesplnil (těch bude ~100) a ty následně v PHP zkontroluješ.
Úlohy budou uložené v jedné tabulce a budou odkazovat na PHP třídy, které budou mít metodu test(AgregovanáHistorie, AktuálníÚlovek).
Kajman
Profil
Otázkou je, co je častější - zda úlovek nebo potřeba přepočítat statistiky úkolů. Pokud se hodně loví a málo zobrazuje statistika, tak je lepší přístup dle juriada.

Ty úkoly typu "100 ks cejnů", "50 kg plotic" by mohly mít navíc příznak postupného zpracování. Tedy i když splní podmínku, že chytil cejna, nebude automaticky splněn, dokud čítač splněnosti nepřekročí hranici.

V tabulce úkolů splněných úkolů uživatele můžete mít navíc i příznak, že je úkol rozpracován a pokud si tam budete do toho rozpracovaného přidávat kusy a kila, dokud není splněn, tak po každém úlovku uděláte jeden dotaz, co najde nesplněné úkoly, co tímto úlovkem splnil nebo částečně splnil. Uživatel pak může vidět, že má třeba 30% úkolu na plotice splněno.
JardaB
Profil
Struktura tabulky je následující a žádné současné dotazy logicky nemám. Chci prvně navrhnout strukturu dotazů a potom je mohu psát. Typy úkolů jsem myslím popsal dost srozumitelně.

`id`
  `id_klient`
  `id_sumare`
  `id_game` 
  `id_revir` 
  `id_ryby`
  `id_n`
  `ks`
  `kg` 
  `cm`
  `trofej`
  PRIMARY KEY (`id`)

zapisuje se každá chycená ryba s identifikací klienta, reviru a sumáře. Pro mě jsou podstatné sloupce ks, kg, cm, id_n
Pokud budu chtít jen úkoly typu chyť určitý počet nebo váhu, tak je to snadné. Ale chtěl jsem mnohem víc specifické úkoly. Třeba chyť kapra a sumce v tomto pořadí za sebou. Nebo chyť kapra na návnadu ID atd, případně i složitější úkoly. To si tedy moc nedokážu představit jak bych to natěsnal do jednoho dotazu. Všechny úkoly zatím vymyšlené nejsou. Ale potřebuji, než to začnu psát, aby to fungovalo jak pro snadno ověřitelné úkoly tak i pro složitější dotazy. Nemyslím že zjištění zda jsem chytil jednoho kapra nebo zda jsem chytil cejna a kapra v tomto pořadí a na určitou návnadu, bude univerzální dotaz.


juriad:
Ano to by šlo... Podobně jsem to měl v úmyslu, zjistit nesplněné a porovnat s aktuálním úlovkem. Nicméně si myslím, že na složité úkoly se nevyhnu specifickému dotazu do dtb navíc.
Kajman
Profil
Tak zkuste navrhnout ještě tu tabulku ukolů, tak aby co nejvíce úkolů šlo do ní parametrizovat. Hodnoty, co nejsou v úkolu, budou null. Kusy, kila si udělejte asi v rozsahu od do.

chyť kapra na návnadu ID
- řádek z tabulky úkolů bude mít vyplněný sloupec id_ryby a id_n

chytni trofejní rybu nad 10 kg
- řádek bude mít vyplněný sloupec kg_min=10 a trofej=1

chytni 100 ks cejn
- řádek bude mít vyplněný sloupec id_ryby a příznak, že se plní postupně

chyť kapra a sumce v tomto pořadí za sebou
- řádek bude mít vyplněný sloupec id_ryby (na sumce) a příznak, že se má ještě speciálně zpracovat v php (koukne na předchozí úlovek, zda je kapr)
JardaB
Profil
Kajman:
V tabulce úkolů splněných úkolů uživatele můžete mít navíc i příznak, že je úkol rozpracován a pokud si tam budete do toho rozpracovaného přidávat kusy a kila, dokud není splněn, tak po každém úlovku uděláte jeden dotaz, co najde nesplněné úkoly, co tímto úlovkem splnil nebo částečně splnil. Uživatel pak může vidět, že má třeba 30% úkolu na plotice splněno.

Tohle se mi líbí.. děkuji.


Kajman:
Tak zkuste navrhnout ještě tu tabulku ukolů, tak aby co nejvíce úkolů šlo do ní parametrizovat. Hodnoty, co nejsou v úkolu, budou null. Kusy, kila si udělejte asi v rozsahu od do.

Ano, zkusím to takto, zdá se mi to jako dobré řešení. Děkuji mnohokrát..

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: