Autor Zpráva
Darth-Cz-
Profil *
Dobrý den,

chtěl bych se zeptat, zda jde nějakým způsobem v dotazu:

$query = "Select ".self::TAB_WEBY.".url, ".self::TAB_KLIENT.".firma, ".self::TAB_KLICOVA_SLOVA.".kl_slovo,
                 ".self::TAB_ANALYZY_KL_SLOV.".*
                  from ".self::TAB_WEBY."
                  join ".self::TAB_TYPY_SLUZEB."
                  on ".self::TAB_WEBY.".typy_sluzeb_id = ".self::TAB_TYPY_SLUZEB.".id
                  join ".self::TAB_KLIENT."
                  on ".self::TAB_KLIENT.".uzivatele_id = ".self::TAB_WEBY.".uzivatele_id
                  join ".self::TAB_ANALYZY."
                  on ".self::TAB_ANALYZY.".weby_id = ".self::TAB_WEBY.".id
                  join ".self::TAB_ANALYZY_KL_SLOV."
                  on ".self::TAB_ANALYZY_KL_SLOV.".analyzy_id = ".self::TAB_ANALYZY.".id
                  join ".self::TAB_KLICOVA_SLOVA."
                  on ".self::TAB_KLICOVA_SLOVA.".id = ".self::TAB_ANALYZY_KL_SLOV.".klicova_slova_id
                  where ".self::TAB_TYPY_SLUZEB.".typ_sluzby = 'seo' AND ".self::TAB_ANALYZY.".typ_analyzy = 'kl_slov'";


určit, že chci pouze první a poslední nalezený řádek z tabulky self::TAB_ANALYZY_KL_SLOV. Nechci všechny nalezené.

Jde mi o řešení v mysql dotazu, přijde mi zbytečné načíst obrovskou hromadu záznamů, a pak v php vybrat první a poslední prvek pole.

Za odpověď děkuji
__construct
Profil
Do dotazu pridaj …ORDER BY `nejakyStlpec` DESC LIMIT 1 a potom polož ten istý dotaz, ale zmeň …ORDER BY `nejakyStlpec` ASC LIMIT 1. Alebo ak máš > MySQL 5 tak môžeš tie dva dotazy spojiť do jedného použitím UNION.
Darth-Cz-
Profil *
__construct:
Neexistuje lepší řešení než zdvojením dotazu? :) Myslel jsem něco na styl
where (".self::TAB_ANALYZY_KL_SLOV.".id HAVING MIN(".self::TAB_ANALYZY_KL_SLOV.".id)
                OR ".self::TAB_ANALYZY_KL_SLOV.".id HAVING MAX(".self::TAB_ANALYZY_KL_SLOV.".id))


aneb z vybaných záznamů vybrat záznam s nejmenším a největším id. Nemůžu ale přijít na správnou syntaxi :(
Darth-Cz-
Profil *
Tak toto mi skutečně vrátí první a poslední nalezený záznam:

$query = "(Select ".self::TAB_WEBY.".url, ".self::TAB_KLIENT.".firma, ".self::TAB_KLICOVA_SLOVA.".kl_slovo,
                          ".self::TAB_ANALYZY_KL_SLOV.".*
                          from ".self::TAB_WEBY."
                          join ".self::TAB_TYPY_SLUZEB."
                          on ".self::TAB_WEBY.".typy_sluzeb_id = ".self::TAB_TYPY_SLUZEB.".id
                          join ".self::TAB_KLIENT."
                          on ".self::TAB_KLIENT.".uzivatele_id = ".self::TAB_WEBY.".uzivatele_id
                          join ".self::TAB_ANALYZY."
                          on ".self::TAB_ANALYZY.".weby_id = ".self::TAB_WEBY.".id
                          join ".self::TAB_ANALYZY_KL_SLOV."
                          on ".self::TAB_ANALYZY_KL_SLOV.".analyzy_id = ".self::TAB_ANALYZY.".id
                          join ".self::TAB_KLICOVA_SLOVA."
                          on ".self::TAB_KLICOVA_SLOVA.".id = ".self::TAB_ANALYZY_KL_SLOV.".klicova_slova_id
                          where ".self::TAB_TYPY_SLUZEB.".typ_sluzby = 'seo' AND ".self::TAB_ANALYZY.".typ_analyzy = 'kl_slov'
                          order by ".self::TAB_ANALYZY_KL_SLOV.".id DESC LIMIT 1) 
                          UNION
                          (Select ".self::TAB_WEBY.".url, ".self::TAB_KLIENT.".firma, ".self::TAB_KLICOVA_SLOVA.".kl_slovo,
                          ".self::TAB_ANALYZY_KL_SLOV.".*
                          from ".self::TAB_WEBY."
                          join ".self::TAB_TYPY_SLUZEB."
                          on ".self::TAB_WEBY.".typy_sluzeb_id = ".self::TAB_TYPY_SLUZEB.".id
                          join ".self::TAB_KLIENT."
                          on ".self::TAB_KLIENT.".uzivatele_id = ".self::TAB_WEBY.".uzivatele_id
                          join ".self::TAB_ANALYZY."
                          on ".self::TAB_ANALYZY.".weby_id = ".self::TAB_WEBY.".id
                          join ".self::TAB_ANALYZY_KL_SLOV."
                          on ".self::TAB_ANALYZY_KL_SLOV.".analyzy_id = ".self::TAB_ANALYZY.".id
                          join ".self::TAB_KLICOVA_SLOVA."
                          on ".self::TAB_KLICOVA_SLOVA.".id = ".self::TAB_ANALYZY_KL_SLOV.".klicova_slova_id
                          where ".self::TAB_TYPY_SLUZEB.".typ_sluzby = 'seo' AND ".self::TAB_ANALYZY.".typ_analyzy = 'kl_slov'
                          order by ".self::TAB_ANALYZY_KL_SLOV.".id ASC LIMIT 1)";


Problém ale je, že to najde první a poslední záznam ze všech záznamů. Já potřebuji ale vždy první a poslední záznam pro každé klíčové slovo.
Tudíž pro každou položku ".self::TAB_KLICOVA_SLOVA.".id mi to vrátí např. 5 položek z ".self::TAB_ANALYZY_KL_SLOV." a z těch 5 položek potřebuji jen první a poslední.
Darth-Cz-
Profil *
Tak už se mi trochu zadařilo a slušné výsledky poskytuje dotaz:

Select analyzy.id as an_id, weby.url, klient.firma, klicova_slova.kl_slovo, analyzy_kl_slov.* from weby join typy_sluzeb on weby.typy_sluzeb_id = typy_sluzeb.id join klient on klient.uzivatele_id = weby.uzivatele_id join analyzy on analyzy.weby_id = weby.id join analyzy_kl_slov on analyzy_kl_slov.analyzy_id = analyzy.id join klicova_slova on klicova_slova.id = analyzy_kl_slov.klicova_slova_id where typy_sluzeb.typ_sluzby = 'seo' AND analyzy.typ_analyzy = 'kl_slov' group by kl_slovo having an_id = ANY(Select max(id) from analyzy where typ_analyzy = 'kl_slov' group by weby_id)


Problém je, že having bere z any pouze první a poeslední hodnotu :( Nevíte, jak ho donutit aby bral všechny?
Darth-Cz-
Profil *
Select analyzy.id as an_id, weby.url, klient.firma, klicova_slova.kl_slovo, analyzy_kl_slov.* 
from weby 
join typy_sluzeb 
on weby.typy_sluzeb_id = typy_sluzeb.id 
join klient 
on klient.uzivatele_id = weby.uzivatele_id 
join analyzy 
on analyzy.weby_id = weby.id 
join analyzy_kl_slov 
on analyzy_kl_slov.analyzy_id = analyzy.id 
join klicova_slova 
on klicova_slova.id = analyzy_kl_slov.klicova_slova_id 
where typy_sluzeb.typ_sluzby = 'seo' AND analyzy.typ_analyzy = 'kl_slov' 
group by kl_slovo 
having an_id = ANY(Select max(id) from analyzy where typ_analyzy = 'kl_slov' group by weby_id)
Darth-Cz-
Profil *
Tak jsem to vyřešil takto:

(Select weby.url, klient.firma, klicova_slova.kl_slovo, analyzy_kl_slov.* 
from weby 
join typy_sluzeb 
on weby.typy_sluzeb_id = typy_sluzeb.id 
join klient 
on klient.uzivatele_id = weby.uzivatele_id 
join analyzy 
on analyzy.weby_id = weby.id 
join analyzy_kl_slov 
on analyzy_kl_slov.analyzy_id = analyzy.id 
join klicova_slova 
on klicova_slova.id = analyzy_kl_slov.klicova_slova_id 
where typy_sluzeb.typ_sluzby = 'seo' AND analyzy.typ_analyzy = 'kl_slov' 
      AND analyzy.id = ANY(Select min(id) from analyzy where typ_analyzy = 'kl_slov' group by weby_id) 
group by kl_slovo) 
UNION 
(Select weby.url, klient.firma, klicova_slova.kl_slovo, analyzy_kl_slov.* 
from weby 
join typy_sluzeb 
on weby.typy_sluzeb_id = typy_sluzeb.id 
join klient 
on klient.uzivatele_id = weby.uzivatele_id 
join analyzy 
on analyzy.weby_id = weby.id 
join analyzy_kl_slov 
on analyzy_kl_slov.analyzy_id = analyzy.id 
join klicova_slova 
on klicova_slova.id = analyzy_kl_slov.klicova_slova_id 
where typy_sluzeb.typ_sluzby = 'seo' AND analyzy.typ_analyzy = 'kl_slov' 
      AND analyzy.id = ANY(Select max(id) from analyzy where typ_analyzy = 'kl_slov' group by weby_id) 
group by kl_slovo) 


Nicméně kdyby jste někdo věděl, jak tento dotaz vylepšit či zoptimalizovat, budu jen rád :)
Darth-Cz-
Profil *
zoptimalizováno - bez unionu:

Select weby.url, klient.firma, klicova_slova.kl_slovo, analyzy_kl_slov.* 
from weby 
join typy_sluzeb 
on weby.typy_sluzeb_id = typy_sluzeb.id 
join klient 
on klient.uzivatele_id = weby.uzivatele_id 
join analyzy 
on analyzy.weby_id = weby.id 
join analyzy_kl_slov 
on analyzy_kl_slov.analyzy_id = analyzy.id 
join klicova_slova 
on klicova_slova.id = analyzy_kl_slov.klicova_slova_id 
where typy_sluzeb.typ_sluzby = 'seo' 
      AND (analyzy.id = ANY(Select min(id) from analyzy where typ_analyzy = 'kl_slov' group by weby_id) 
            OR analyzy.id = ANY(Select max(id) from analyzy where typ_analyzy = 'kl_slov' group by weby_id))
Kajman_
Profil *
zoptimalizováno - bez unionu
Tipuji, že vnitřně si db stejně přepíše ten or na union, takže explain bude totožný.
Darth-Cz-
Profil *
Kajman:
Tak jsem to zkusil, a explainy se liší. Ten OR nebyl přeložen na UNION.
Kajman_
Profil *
Tak to jsem teda tipoval špatně. Pardon.

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: