Autor Zpráva
rampa76
Profil
Zdravím, potřeboval bych nějaký nápad ohledně odstranění duplicity.

1. Dotaz, který vrátí všechno:
SELECT CpsCategory FROM CpsStiVal JOIN I6SpresentTree ON (StiId = SptStiId) WHERE SptStrId = '14727' AND CpsVyhledat = 'VYH'

Zobrazeny záznamy 0 - 29 (21 661 celkem, Dotaz zabral 0.0012 sekund)

EXPLAIN
id     select_type     table     type     possible_keys     key     key_len     ref     rows     Extra
1     SIMPLE     I6SpresentTree     ref     SptStrId,SptStiId     SptStrId     4     const     475      
1     SIMPLE     CpsStiVal     ref     StiId,CpsVyhledat,Grupovani     StiId     4     web21db1.I6SpresentTree.SptStiId     19     Using where

2. Dotaz bez duplicit
SELECT CpsCategory FROM CpsStiVal JOIN I6SpresentTree ON (StiId = SptStiId) WHERE SptStrId = '14727' AND CpsVyhledat = 'VYH' GROUP BY CpsCategory

Zobrazeny záznamy 0 - 18 (19 celkem, Dotaz zabral 0.1752 sekund)

EXPLAIN
id     select_type     table     type     possible_keys     key     key_len     ref     rows     Extra
1     SIMPLE     I6SpresentTree     ref     SptStrId,SptStiId     SptStrId     4     const     475     Using temporary; Using filesort
1     SIMPLE     CpsStiVal     ref     StiId,CpsVyhledat,Grupovani     StiId     4     web21db1.I6SpresentTree.SptStiId     19     Using where

Má někdo prosím nápad, který by to odstranění duplicit neprodloužil "stokrát"? Distinct jsem zkoušel, výsledek je stejný.
Díky moc za případnou radu.
Tori
Profil
rampa76:
Jaký je počet řádků v obou tabulkách a) celkem, b) po přidání omezení ve WHERE? Kterých tabulek se týkají podmínky ve WHERE? Zkoušel jste něco jako

SELECT DISTINCT sloupec FROM t1 
JOIN (SELECT id FROM t2 WHERE ....) tj ON t1.id = tj.id
- přičemž v poddotazu by byla ta tabulka, kde je větší rozdíl mezi počtem řádků celkem a po přidání WHERE.
rampa76
Profil
Tori:
Bez omezeni WHERE:
Tabulka CpsStiVal - Zobrazeny záznamy 0 - 29 (170 499 celkem, Dotaz zabral 0.0005 sekund)
Tabulka I6SpresentTree - Zobrazeny záznamy 0 - 29 (138 442 celkem, Dotaz zabral 0.0012 sekund)

Po přidání podmínek do dotazu a spojeni tabulek:
Zobrazeny záznamy 0 - 29 (21 661 celkem, Dotaz zabral 0.0012 sekund)
WHERE se týká těch dvou tabulek výše, jak je patrně z sql dotazu v prvním postu.

Ten dotaz co navrhujete jsem zkoušel, vrátí to stejně n opakujících se řádků, které je pak nutné opět zgrupovat, takže to problém neřeší :-(


Tori:
Dotaz typu:
select distinct CpsCategory from CpsStiVal join (
select SptStiId from I6SpresentTree where SptStrId = 14727
) t on (SptStiId = StiId) where CpsVyhledat = 'VYH'

je ještě o zlomek pomalejší (Dotaz zabral 0.3362 sekund) než původní seskupený dotaz "SELECT CpsCategory FROM CpsStiVal JOIN I6SpresentTree ON (StiId = SptStiId) WHERE SptStrId = '14727' AND CpsVyhledat = 'VYH' GROUP BY CpsCategory", který zabral 0.1746 sekund.
tiso
Profil
rampa76: v takýchto prípadoch (30 záznamov vs. 19) je rýchlejšie vybrať viac riadkov a prefiltrovať ich až pri výpise (PHP).
btw. tie názvy tabuliek a stĺpcov vymýšľal kto?
rampa76
Profil
tiso:
jj, taky to vidíme na php.
Já vím, že názvy nejsou zrovna košér, ale co s tím už teď nadělám...
Kajman
Profil
rampa76:

Existuje pro CpsCategory číselník (další tabulka)? A kolik je v ní případně řádků?
rampa76
Profil
Kajman:
Ano, existuje tabulka CpsCategory kterou jsem si založil, když to teď řeším - sloupce: CpcId (Primary), CpcIdKat, CpcNameKat.
Dále mám v tabulce CpsStiVal vazební sloupec CpsIdKat, ktery se rovná CpcIdKat v tabulce CpsCategory.
Chtěl jsem to nějak svázat a vybrat, ale stále končím u toho, že buď je to potřeba zgrupovat v poddotazu do tabulka CpsStival, nebo grupovat až nad výsledným dotazem co tabulky CpsCategory.
Vždy je to řádově "stokrát" pomalejší než úplně první dotaz v mém prvním příspěvku, kde se negrupuje a vrátí to cca 22 tisíc záznamů téměř okamžitě.
Kajman
Profil
Možná by šlo něco takového, ale je třeba to bude ještě pomalejší. Počet řádků v číselníky to hodně ovlivní.
SELECT cpcnamekat
FROM   cpscategory c
WHERE  EXISTS (SELECT cpsidkat
               FROM   cpsstival
                      JOIN i6spresenttree
                        ON ( stiid = sptstiid )
               WHERE  sptstrid = '14727'
                      AND cpsvyhledat = 'VYH'
                      AND cpsstival.cpsidkat = c.cpsidkat
               LIMIT  1) 

Také by se mohl hodit index na více sloupci (StiId,CpsVyhledat,CpsIdKat)

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: