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
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

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:

0