Autor | Zpráva | ||
---|---|---|---|
patricek Profil |
Zdravím,
s SQL tak nějak začínám, chci se zeptat, jestli by šel zrychlit následující dotaz.... děkuji za případné reakce begin if (select count(id) from `movie_alt_title` where `movie_id` = movieID and `language_id` = langID) = 1 THEN select title from movie_alt_title where `movie_id` = movieID and `language_id` = langID; else select title from movie_alt_title where `movie_id` = movieID and `language_id` = 39; end if; end |
||
Kajman Profil |
#2 · Zasláno: 1. 9. 2018, 22:51:51
V jaké to je databázi?
Voláte pak tuto funkci v jednom sql dotazu pro více filmů? |
||
juriad Profil |
Zkusil jsem něco sepsat tak, aby (snad) nezáleželo na odpovědích na Kajmanovy otázky.
SELECT movie_id, COALESCE(MAX(lang_title), MAX(default_title)) AS title FROM ( SELECT movie_id, CASE WHEN language_id = 39 THEN title END AS default_title, CASE WHEN language_id != 39 THEN title END AS lang_title FROM movie_alt_title WHERE movie_id IN (list of movie ids) AND language_id IN (langId, 39) ) mt GROUP BY movie_id Viz ukázka na sqlfiddle.com/#!9/3449494/1 |
||
patricek Profil |
Kajman
1) MySQL 2) Jde o to, že vypisuji filmy, třeba kategorii Akční takže mám tabulku movie, k tomu movie_genre... Takže vypíšu data podle movie_genre k tomu si pripojim movie tabulku a pak k tomu potřebuji nadpis podle toho co má uživatel za jazyk a když není, tak hodí language_id = 39, coz je AJ název a ten je vždy ten nadpis tedy vyvolam funkci v php kde dosadim parametry pro tu proceduru, coz je movieID a langID, jenže když už mám na stránce třeba 100 filmů, tak ta funkce mě to dost brzdí a dostanu se až na 400ms... Bohužel mě nenapadá lepší řešení juriad: Děkuji moc, Akorát doba je stejná, snad se mě to podaří napasovat do jednoho SQL dotazu, abych tu funkci v php nemusel volat, tam bude asi ten kámen úrazu :( Můžu prosím jeste jeden dotaz, pro pochopení ? Proč to hází mid jako neznámý sloupec ? Nějak jsem pomatený a jdu na to nějak špatně... SELECT COALESCE(MAX(lang_title), MAX(default_title)) AS title, c.movie_id as mid FROM ( SELECT movie_id, CASE WHEN language_id = 39 THEN title END AS default_title, CASE WHEN language_id != 39 THEN title END AS lang_title FROM movie_alt_title WHERE movie_id = mid AND language_id IN (34, 39) ) mt, movie_cinema c WHERE c.id = 1 Děkuji moc... |
||
Kajman Profil |
Pokud by byl v tabulce překladů jedinečný klíč nad kombinací move_id, language_id, tak bych zvážil
select x.*, coalesce(t1.title,t2.title) preklad from (select 1 id from dual union all select 2 from dual union all select 3 from dual) x left join movie_alt_title t1 on x.id=t1.movie_id and t1.language_id=1 left join movie_alt_title t2 on x.id=t2.movie_id and t2.language_id=39 Kde v té závorce označené x bude dosavadní dotaz (klidně i s limitem a order by, pokud se podle překladu neřadí). Edit: Ale alternativních názvů asi může být v jednom jazyku víc (až to podle procedury nevypadá), tak to nebude primární klíč, ale je možné, že pomalost je způsobená absencí indexu nad kombinací sloupců, podle kterých se to hledá. V tom případě bych zkusil změřit rychlost toho třetího dotazu... sqlfiddle.com/#!9/c2a13d/6 |
||
Časová prodleva: 6 let
|
0