Autor | Zpráva | ||
---|---|---|---|
Darth-Cz- Profil * |
#1 · Zasláno: 11. 1. 2011, 13:01:18
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 |
#2 · Zasláno: 11. 1. 2011, 13:10:39 · Upravil/a: __construct
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 * |
#3 · Zasláno: 11. 1. 2011, 13:16:41
__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 * |
#4 · Zasláno: 11. 1. 2011, 13:32:15
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 * |
#5 · Zasláno: 11. 1. 2011, 14:37:51
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 * |
#6 · Zasláno: 11. 1. 2011, 14:39:02
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 * |
#7 · Zasláno: 11. 1. 2011, 15:11:17
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 * |
#8 · Zasláno: 11. 1. 2011, 15:31:10
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 * |
#9 · Zasláno: 11. 1. 2011, 16:06:04
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 * |
#10 · Zasláno: 11. 1. 2011, 16:16:15
Kajman:
Tak jsem to zkusil, a explainy se liší. Ten OR nebyl přeložen na UNION. |
||
Kajman_ Profil * |
#11 · Zasláno: 11. 1. 2011, 16:38:24
Tak to jsem teda tipoval špatně. Pardon.
|
||
Časová prodleva: 13 let
|
0