NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Martin Konečný (pavelco1998):18.12.2016 20:35

Ahoj,

mám v aplikaci několik primitivních dotazů, které jen zjišťují, jestli v daných tabulkách existuje dle podmínek alespoň jeden záznam. Aby se zbytečně neposílalo N dotazů, uvažuji nad řešením, že se všechny výsledky získají jedním SQL dotazem.

Nyní to vypadá nějak takto:

SELECT COUNT(*)
FROM `message`
WHERE `player_id` = 18 AND `report` = 1
LIMIT 1

SELECT COUNT(*)
FROM `quest`
WHERE `player_id` = 18 AND `completed` = 1
LIMIT 1

SELECT 1
FROM `player_stash`
WHERE `player_id` = 18 AND `location_id` = 1
LIMIT 1

Vyřešit se to dá například takto:

SELECT (
        SELECT COUNT(*)
        FROM `message`
        WHERE `player_id` = 18 AND `report` = 1
        LIMIT 1
) AS messagesCount,

(
        SELECT COUNT(*)
        FROM `quest`
        WHERE `player_id` = 18 AND `completed` = 1
        LIMIT 1
) AS questsCount

... atd.

Mám ale pocit, že jsem někde četl, že MySQL neumí v poddotazech využít indexy. Co je na tom pravdy? Má druhé řešení nějakou zásadní nevýhodu? Případně lze to vyřešit ještě nějak elegantněji?
Ty dotazy jsou velmi jednoduché, tudíž by měly tak jako tak být rychlé, ale pokud mohu z deseti komunikací s databází udělat jen jednu, zdá se mi to efektivnější.

Někdo zkušenější, kdo by mohl poradit? :)

Editováno 18.12.2016 20:36
Odpovědět
18.12.2016 20:35
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Šimon Zimák:19.12.2016 0:55

Můžeš použít VIEW

 
Nahoru Odpovědět
19.12.2016 0:55
Avatar
Jan Bezdíček
Tvůrce
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Jan Bezdíček:19.12.2016 9:36

Pouzij normalne klauzuli JOIN ... najdi si ji na w3schools a pochopis. View je na tohle zbytecny

 
Nahoru Odpovědět
19.12.2016 9:36
Avatar
Odpovídá na Jan Bezdíček
Martin Konečný (pavelco1998):19.12.2016 10:22

Já JOINy znám moc dobře, jen se mi moc nezdá, že by se posílal jeden dotaz, kde by jich bylo třeba deset :D
Každopádně děkuji za radu

Nahoru Odpovědět
19.12.2016 10:22
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Michal Štěpánek:19.12.2016 13:42

Vím, že to nesouvisí s tvým dotazem, ale k čemu tam máš to

LIMIT 1

podle mě

SELECT COUNT(*)...

vrací jen jediné číslo, nebo se pletu?

Nahoru Odpovědět
19.12.2016 13:42
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Michal Štěpánek
Martin Konečný (pavelco1998):19.12.2016 13:59

Ano, vrací to jen jedno číslo a ruku na srdce, nevím, jak přesně COUNT() funguje, ale přišlo mi, že by si mohla databáze poradit o něco rychleji, když jí natvrdo řeknu, že má hledat jen jeden záznam.
U COUNT() je to asi vážně blbost, ale např. u toho třetího dotazu by to dle mě mohlo mít trochu využití, jelikož nepotřebuji zjistit počet záznamů, ale jen, jestli je tam alespoň jeden.
Ale je mi jasné, že to je taková drobnost, že ani nemá smysl se tím nějak zabývat.

Nahoru Odpovědět
19.12.2016 13:59
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.