Autor Zpráva
Watchick
Profil
Zdravím, mám SQL dotaz:
SELECT idpole FROM budovy WHERE iductu='1' AND (SELECT drevo FROM typybudov WHERE lvl=budovy.lvl AND id=budovy.typ)<'182' AND (SELECT hlina FROM typybudov WHERE lvl=budovy.lvl AND id=budovy.typ)<'51' AND (SELECT zelezo FROM typybudov WHERE lvl=budovy.lvl AND id=budovy.typ)<'80' AND (SELECT obili FROM typybudov WHERE lvl=budovy.lvl AND id=budovy.typ)<'219' AND typ='4' ORDER BY lvl ASC LIMIT 1

jde prakticky o to že v tabulce budovy mám "stavební políčka" 1-20 a u každého údaje mám napsáno, na jakém levelu a jaký typ budovy to je.
v typybudovy mám napsány obecné informace, kolik čeho stojí vylepšení na každý level....
tento dotaz úspěšně vybere budovu, na kterou mám suroviny, abych jí mohl postavit/vylepšit.
(jsou 4 suroviny, drevo, hlina, zelezo a obilí), stejně tak mám 4 typy budov... doly na kazdou z techto surovin...
a potřeboval bych do tohoto příkazu přidat " že když mám větší produkci dreva, tak vylepšit hlínu, přestože by byla hlína nejdříve, podle"lvl ASC", a třeba, vždy, že by stačilo dát reprezentaci, co preferuji nejvíce, a co nejméně, tedy (drevo-obili)=(1-4), tedy ze preferuji 2,4,1,3.
Jde to nějak, nebo se musí vybrat všechny budovy, které připadají v úvahu, a pak mezi nimi ještě vybrat?

Doufám, že jsem to podal co nejsrozumitelněji, děkuji
Watchick
TomášK
Profil
Pár poznámek:
* ne každý má tři monitory, aby se mu tam celý dotaz vešel naráz. Takhle je de facto nečitelný a člověk si ho musí zkopírovat do editoru a zalomit řádky, aby z toho něco měl. To určitě nenaláká respondenty.
* čísla do uvozovek nepatří, sice to většinou funguje, ale třeba výraz '100' < '20' označí mysql jako pravdivý. Jednou se můžeš spálit...
* mrkni na join, dokáže ten dotaz dost zjednodušit, nemluvě o tom, že to bude řádově rychlejší, což ale na těch při těch pár záznamech asi není tak důležité.
* jestli máš v kódu opravdu ty čísla jako 182,51, tak je dej do nějakých konstant, ať je vidět, co to je (množství surovin, které hráč má?)

Dotaz s použitím joinu (měl by dávat totožné výsledky, pokud se nepletu):
SELECT 
    idpole
FROM 
    budovy
    JOIN typbudov ON typbudov.lvl=budovy.lvl AND typbudovy.id=budovy.typ
WHERE
    iductu = 1 AND
    drevo < 182 AND
    hlina < 51 AND 
    zelezo < 80 AND
    obili < 219 AND
    typ = 4 
ORDER BY lvl ASC LIMIT 1;


A co se týče samotného dotazu:
rozumím, že máš budovu, která ma určitý typ. Není mi jasné, co je produkce a jak zjistit, jak velkou má hráč produkci. Není mi jasný pojem "vylepšit hlínu" - chápu, že jde vylepšit budova, ale nedává mi smysl vylepešní suroviny. Co znamená, že "hlína byla nejdříve"? Myslím, že to z toho dostat půjde, když se doberem toho, co chceš dostat.
Watchick
Profil
Zdravím, mám SQL dotaz:
$ve_skladu_dreva = 182;
$ve_skladu_hliny = 51;
$ve_skladu_zeleza = 80;
$ve_skladu_obili = 219;
SELECT 
    idpole 
FROM 
    budovy 
WHERE 
    iductu='1' AND 
    (SELECT drevo FROM typybudov WHERE lvl=budovy.lvl AND id=budovy.typ)<=$ve_skladu_dreva AND 
    (SELECT hlina FROM typybudov WHERE lvl=budovy.lvl AND id=budovy.typ)<=$ve_skladu_hliny AND 
    (SELECT zelezo FROM typybudov WHERE lvl=budovy.lvl AND id=budovy.typ)<=$ve_skladu_zeleza AND 
    (SELECT obili FROM typybudov WHERE lvl=budovy.lvl AND id=budovy.typ)<=$ve_skladu_obili AND 

ORDER BY lvl ASC 
LIMIT 1

Omlouvám se, ten "typ = '4'" by tam pouze mátlo, tak jsem ho odstranil...
/to je tam jen taková pojista, aby nebylo příliš málo obilí, a zrovna kdyz jsem prikaz kopiroval, tak k tomu doslo/
Jde o to, že jsou takováto (výdělečná surovinová pole):

(to číslo u každého z nich je ID pole)
a tyto pole se mohou vylepšovat a vylepšovat, a s každým vylepšením vám přibívá více surovin/hodinu
tedy je třeba možné, abych měl příjmy:
dřevo: 50/hodinu (což je v budovach "typ" 1, a v typech budov je to "id")
hlína: 60/hodinu(což je v budovach "typ" 2, a v typech budov je to "id")
Železo: 30/hodinu(což je v budovach "typ" 3, a v typech budov je to "id")
obilí: 100/hodinu(což je v budovach "typ" 4, a v typech budov je to "id")


Ve skladech jsou suroviny vytěžené(pokud v 00:00 mám s takovýmito příjmy sklady prázdné, tak v 02:30 budou sklady na hodnotách: 125,150,75,250)

TomášK Díky že sis udělal práci :)
Watchick
Profil
Taže to asi nakonec mám udělat tak, že si je vypíšu všechny a pak v php vyberu ten nejlepší, že? :D

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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