abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
eParkomat, startup z ČR, postoupil mezi finalisty evropského akcelerátoru ChallengeUp!
Robot na pivo mu otevřel dveře k opravdovému byznysu
Internet věcí: Propojený svět? Už se to blíží...
dnes 06:00 | Komunita

Na YouTube byl publikován Blender Institute Reel 2016, ani ne dvouminutový sestřih z filmů, které vznikly za posledních 10 let díky Blender Institutu. V institutu aktuálně pracují na novém filmu Agent 327. Dění kolem filmu lze sledovat na Blender Cloudu. Videoukázka Agenta 327 z června letošního roku na YouTube.

Ladislav Hagara | Komentářů: 0
dnes 01:02 | Zajímavý článek

Minulý týden byly vydány verze 1.2.3 a 1.1.7 webového poštovního klienta Roundcube. V oznámení o vydání bylo zmíněno řešení bezpečnostního problému nalezeného společností RIPS a souvisejícího s voláním funkce mail() v PHP. Tento týden byly zveřejněny podrobnosti. Útočník mohl pomocí speciálně připraveného emailu spustit na serveru libovolný příkaz. Stejně, jak je popsáno v článku Exploit PHP’s mail() to get remote code execution z roku 2014.

Ladislav Hagara | Komentářů: 0
včera 16:00 | Nová verze

Byla vydána verze 0.98 svobodného nelineárního video editoru Pitivi. Z novinek lze zmínit například přizpůsobitelné klávesové zkratky. Videoukázka práce s nejnovější verzí Pitivi na YouTube.

Ladislav Hagara | Komentářů: 1
včera 15:00 | Zajímavý software

Stop motion je technika animace, při níž je reálný objekt mezi jednotlivými snímky ručně upravován a posouván o malé úseky, tak aby po spojení vyvolala animace dojem spojitosti. Jaký software lze pro stop motion použít na Linuxu? Článek na OMG! Ubuntu! představuje Heron Animation. Ten bohužel podporuje pouze webové kamery. Podpora digitálních zrcadlovek je začleněna například v programu qStopMotion.

Ladislav Hagara | Komentářů: 3
7.12. 21:21 | Nová verze Ladislav Hagara | Komentářů: 0
7.12. 11:44 | Zajímavý projekt

Na Indiegogo byla spuštěna kampaň na podporu herní mini konzole a multimediálního centra RetroEngine Sigma od Doyodo. Předobjednat ji lze již od 49 dolarů. Požadovaná částka 20 000 dolarů byla překonána již 6 krát. Majitelé mini konzole si budou moci zahrát hry pro Atari VCS 2600, Sega Genesis nebo NES. Předinstalováno bude multimediální centrum Kodi.

Ladislav Hagara | Komentářů: 2
7.12. 00:10 | Nová verze

Byla vydána verze 4.7 redakčního systému WordPress. Kódové označením Vaughan bylo vybráno na počest americké jazzové zpěvačky Sarah "Sassy" Vaughan. Z novinek lze zmínit například novou výchozí šablonu Twenty Seventeen, náhledy pdf souborů nebo WordPress REST API.

Ladislav Hagara | Komentářů: 9
6.12. 12:00 | Zajímavý projekt

Projekt Termbox umožňuje vyzkoušet si linuxové distribuce Ubuntu, Debian, Fedora, CentOS a Arch Linux ve webovém prohlížeči. Řešení je postaveno na projektu HyperContainer. Podrobnosti v často kladených dotazech (FAQ). Zdrojové kódy jsou k dispozici na GitHubu [reddit].

Ladislav Hagara | Komentářů: 27
6.12. 11:00 | Bezpečnostní upozornění

Byly zveřejněny informace o bezpečnostní chybě CVE-2016-8655 v Linuxu zneužitelné k lokální eskalaci práv. Chyba se dostala do linuxového jádra v srpnu 2011. V upstreamu byla opravena minulý týden [Hacker News].

Ladislav Hagara | Komentářů: 2
5.12. 22:00 | Komunita

Přibližně před měsícem bylo oznámeno, že linuxová distribuce SUSE Linux Enterprise Server (SLES) běží nově také Raspberry Pi 3 (dokumentace). Obraz verze 12 SP2 pro Raspberry Pi 3 je ke stažení zdarma. Pro registrované jsou po dobu jednoho roku zdarma také aktualizace. Dnes bylo oznámeno, že pro Raspberry Pi 3 je k dispozici také nové openSUSE Leap 42.2 (zprávička). K dispozici je hned několik obrazů.

Ladislav Hagara | Komentářů: 6
Kolik máte dat ve svém domovském adresáři na svém primárním osobním počítači?
 (32%)
 (24%)
 (29%)
 (8%)
 (5%)
 (3%)
Celkem 799 hlasů
 Komentářů: 50, poslední 29.11. 15:50
Rozcestník
Reklama

Dotaz: jak odfiltrovat radky se stejnou hodnotou

23.11.2009 07:08 Leoš Literák | skóre: 74 | blog: LL | Praha
jak odfiltrovat radky se stejnou hodnotou
Přečteno: 1377×
Na abicku se muze zobrazovat vice prispevku od jednoho uzivatele, coz obcas vede k tapetovani. Potrebuju tedy upravit SQL prikaz, aby vracel jen jeden zapisek od uzivatele a dalsi, prestoze by jinak do vyberu patrily, ignoroval a nacetl misto nich jine.

Aktualne ma dotaz tuto strukturu (db schema):
SELECT R.cislo FROM polozka P, relace R, spolecne S WHERE
P.typ=12 and P.cislo=R.potomek and typ_potomka='P' and S.typ='P' and S.cislo=R.potomek AND S.vytvoreno<=now() 
ORDER BY S.vytvoreno DESC LIMIT 0,15
Naivne jsem pridal do selectu sloupecek S.pridal, ktery obsahuje id autora, a doplnil GROUP by S.pridal, coz zafungovalo, ale seznam nebyl setrizen podle casu. Klauzule DISTINCT take nema zadny efekt, protoze id relace je vzdy unikatni. Tim jsem uvizl a nez to zacnu resit v jave, poradim se s vami, zda na neco neprijdete.
Zakladatel tohoto portálu. Twitter, LinkedIn, blog, StackOverflow

Odpovědi

23.11.2009 09:03 kulik
Rozbalit Rozbalit vše Re: jak odfiltrovat radky se stejnou hodnotou
Slo by to napriklad pomoci not exists, je to v tomto pripade logictejsi nez group by, kdyz nic negaregujes. Ciste prakticky bych to resil az v te jave, uz jen kvuli jednodussi konfigurovatelnoti (bude to ruzne pro ruzne sekce stranek, "zahozene" budou jen skryte a pujde je na vyzadani zobrazit, ...).
23.11.2009 09:21 Leoš Literák | skóre: 74 | blog: LL | Praha
Rozbalit Rozbalit vše Re: jak odfiltrovat radky se stejnou hodnotou
Mohl bys prosim poslat ukazku s not exists?

Jinak v jave se mi do toho nechce, protoze bych musel tahat vyrazne vice dat jako pojistku, ze tam zbude dostatek polozek po odstraneni tech, ktere tam nepatri. Data jsou pro homepage a konfigurovatelnost tam zatim neplanuju. I kdyz mozna po nasazeni si ji ctenari vyzadaji.
Zakladatel tohoto portálu. Twitter, LinkedIn, blog, StackOverflow
23.11.2009 09:34 kulik
Rozbalit Rozbalit vše Re: jak odfiltrovat radky se stejnou hodnotou
Zhruba neco takoveho, pokud tedy spravne chapu, ze chces nejnovejsi prispevek:
with polozky as (
SELECT R.cislo, s.vytvoreno, s.pridal
  FROM polozka P, relace R, spolecne S 
  WHERE P.typ=12 
    and P.cislo=R.potomek 
    and typ_potomka='P' 
    and S.typ='P' 
    and S.cislo=R.potomek 
    AND S.vytvoreno<=now()
)
select *
  from polozky xx
  where not exists ( select 0
                       from polozky
                       where pridal = xx.pridal
                         and vytvoreno > xx.vytvoreno )
Te javy bych se zas tak moc nebal, jestlize ted tahas 15, muzes tahat rekneme 30 a pokud by to nestacilo, dotahnout si dalsi - je to samozrejme pomalejsi, ale predpokladam, ze v 99% pripadu by se vystacilo s jednim dotazem.
23.11.2009 16:12 neaktivni | skóre: 24 | blog: neaktivni
Rozbalit Rozbalit vše Re: jak odfiltrovat radky se stejnou hodnotou
Resil bych to pres INNER JOIN asi takto:
... AS a INNER JOIN
(SELECT MAX(vytvoreno) AS vytvoreno, pridal FROM spolecne) AS b
ON (a.vytvoreno = b.vytvoreno AND a.pridal = b.pridal)
23.11.2009 19:21 Leoš Literák | skóre: 74 | blog: LL | Praha
Rozbalit Rozbalit vše Re: jak odfiltrovat radky se stejnou hodnotou
Zkusím to, díky. Snad to zvládnu dá dohromady. Jako další riziko vidím MySql verze 5.1, snad to podporuje.
Zakladatel tohoto portálu. Twitter, LinkedIn, blog, StackOverflow
23.11.2009 22:40 kuka
Rozbalit Rozbalit vše Re: jak odfiltrovat radky se stejnou hodnotou
Nezkoumal jsem ten datovy model, ale nemuze vadit, ze se na "b" aplikuji jine podminky nez na "a"?
23.11.2009 23:43 Leoš Literák | skóre: 74 | blog: LL | Praha
Rozbalit Rozbalit vše Re: jak odfiltrovat radky se stejnou hodnotou
Muze mi nekdo vysvetlit, co je mineno tim "AS a", resp. kam to do SQL prikazu patri? Ma to byt nove pojmenovani tabulky S? Lepsi by byl kompletni prikaz. Dik
Zakladatel tohoto portálu. Twitter, LinkedIn, blog, StackOverflow
24.11.2009 08:42 kuka
Rozbalit Rozbalit vše Re: jak odfiltrovat radky se stejnou hodnotou
Ja jsem to pochopil tak, ze "a" je ten tvuj puvodni dotaz (bez trideni a limitu). Myslim ze kompletni kod by nemel byt potreba, jde o jednoduchy postup "hledam radky splnujici me podminky takove, ze jsou zaroven mezi radky s touto vlastnosti posledni za cloveka". To se da bud tak ze si zjistim konkretni cas posledniho (ale mel bych to delat na stejne mnozine dat) a podle nej to pak spojim (cimz starsi radky vypadnou, protoze nematchuji ten posledni cas), nebo tak, ze doplnuju podminku, ze zadny novejsi v mnozine neexistuje. V obou pripadech tam ve vysledku budu mit velmi podobne dotazy dvakrat (prispevek vyse pouzivajici not exists pouziva pro zkraceni konstrukci with, ktera mozna v mysql neni, ale lze to proste trivialne rozepsat do dvou stejnych dotazu na mistech, kde je pouzity ten alias). V cistem SQL podle mne jiny zpusob neni, nejde tam "primo" pracovat s konkretnimi radky z grupovane skupiny) Treba v Oracle na to postupy jsou, lze si vyzadat prvni ze skupiny, predchazejici ve skupine apod., ale to afaik nejsou standardne podporovane veci v SQL.
24.11.2009 09:45 neaktivni | skóre: 24 | blog: neaktivni
Rozbalit Rozbalit vše Re: jak odfiltrovat radky se stejnou hodnotou
Jasne, byl to jen hint. Kompletne by to muselo byt nejak takto (nemam moznost testovat, ale melo by to snad priblizne stacit):
SELECT R.cislo
FROM 
  polozka P
INNER JOIN
  relace R
ON (P.typ=12 and P.cislo=R.potomek and typ_potomka='P')
INNER JOIN
  spolecne S
ON (S.typ='P' and S.cislo=R.potomek AND S.vytvoreno<=now())
INNER JOIN
(
    SELECT MAX(vytvoreno) AS vytvoreno, pridal FROM spolecne
    WHERE S.typ = 'P' AND S.vytvoreno<=now() 
    GROUP BY pridal) AS U
ON (S.vytvoreno = U.vytvoreno AND S.pridal = U.pridal AND S.cislo = U.cislo))
ORDER BY S.vytvoreno DESC LIMIT 0,15
Nejak takto by to melo fungovat, inner joiny jsou v podstate identicke s puvodnim pouzitim where, akorat mi prijdou prehlednejsi. Mozna tam je nejaka chyba a nejspis by to bylo dobre nejak zoptimalizovat. No, uvidite.
24.11.2009 10:49 Leoš Literák | skóre: 74 | blog: LL | Praha
Rozbalit Rozbalit vše Re: jak odfiltrovat radky se stejnou hodnotou
Ted nemam cas to ladit, takze jsem to zkusil jen spustit:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') ORDER BY S.vytvoreno

Vice si pohraju vecer
Zakladatel tohoto portálu. Twitter, LinkedIn, blog, StackOverflow
24.11.2009 11:11 neaktivni | skóre: 24 | blog: neaktivni
Rozbalit Rozbalit vše Re: jak odfiltrovat radky se stejnou hodnotou
jejej, nechal jsem tam zavorku navic
24.11.2009 11:49 Leoš Literák | skóre: 74 | blog: LL | Praha
Rozbalit Rozbalit vše Re: jak odfiltrovat radky se stejnou hodnotou
Dik, mel jsem podezreni, ale v tech zavorkach jsem se ztratil. Ted jsme v inner joinu:
ERROR 1054 (42S22): Unknown column 'S.typ' in 'where clause'
coz resi odstraneni prefixu S. Pak to ale skonci na to, ze tabulka U nema sloupecek cislo: Unknown column 'U.cislo' in 'on clause'
Zakladatel tohoto portálu. Twitter, LinkedIn, blog, StackOverflow
24.11.2009 12:18 neaktivni | skóre: 24 | blog: neaktivni
Rozbalit Rozbalit vše Re: jak odfiltrovat radky se stejnou hodnotou
ja sem tele, tech chyb. kazdopadne, to vsechno je asi jinak. co je cislo? plati ze vyssi cislo znamena novejsi zaznam daneho typu? pokud ano, pak by to melo byt pro zachovani jedinecnosti
SELECT R.cislo
FROM 
  polozka P
INNER JOIN
  relace R
ON (P.typ=12 and P.cislo=R.potomek and typ_potomka='P')
INNER JOIN
  spolecne S
ON (S.typ='P' and S.cislo=R.potomek AND S.vytvoreno<=now())
INNER JOIN
(
    SELECT MAX(cislo) AS cislo, pridal FROM spolecne
    WHERE typ = 'P' AND vytvoreno >= now()
    GROUP BY pridal ) AS U
ON (S.pridal = U.pridal AND S.cislo = U.cislo)
ORDER BY S.vytvoreno DESC LIMIT 0,15
To vrati od kazdeho uzivatele vzdy pouze zaznamy s nejvyssim cislem typu 'P'. Pokud cislo neni nejvyssi u nejnovejsiho zaznamu daneho typu (i kdyz asi je, kdyz je cislo + typ unikatni), pak se to musi hnat pres vytvoreno, ale to je hloupe, protoze nevim, zda je zajistena jedinecnost. v kazdem pripade takto:
SELECT R.cislo
FROM 
  polozka P
INNER JOIN
  relace R
ON (P.typ=12 and P.cislo=R.potomek and typ_potomka='P')
INNER JOIN
  spolecne S
ON (S.typ='P' and S.cislo=R.potomek AND S.vytvoreno<=now())
INNER JOIN
(
    SELECT MAX(vytvoreno) AS vytvoreno, pridal FROM spolecne
    WHERE typ = 'P' AND vytvoreno >= now()
    GROUP BY pridal ) AS U
ON (S.pridal = U.pridal AND S.vytvoreno = U.vytvoreno)
ORDER BY S.vytvoreno DESC LIMIT 0,15
24.11.2009 14:07 Leoš Literák | skóre: 74 | blog: LL | Praha
Rozbalit Rozbalit vše Re: jak odfiltrovat radky se stejnou hodnotou
Neplati, dulezitejsi je S.vytvoreno. Blogy je totiz mozne schedulovat / odkladat, takze treba zapisek vytvoris v lednu, ale publikujes jej az v unoru. Zapisky z konce ledna budou tedy starsi, prestoze maji vyssi id.
Zakladatel tohoto portálu. Twitter, LinkedIn, blog, StackOverflow
24.11.2009 14:12 Leoš Literák | skóre: 74 | blog: LL | Praha
Rozbalit Rozbalit vše Re: jak odfiltrovat radky se stejnou hodnotou
Druhy prikaz nevrati zadna data.
Zakladatel tohoto portálu. Twitter, LinkedIn, blog, StackOverflow
24.11.2009 15:37 neaktivni | skóre: 24 | blog: neaktivni
Rozbalit Rozbalit vše Re: jak odfiltrovat radky se stejnou hodnotou
Mozna to bdue tim, ze jsem tam dopsal blbe tu casovou podminku >= misto <= . Zkuste to zmenit.
24.11.2009 15:37 neaktivni | skóre: 24 | blog: neaktivni
Rozbalit Rozbalit vše Re: jak odfiltrovat radky se stejnou hodnotou
Teda chci rict ze to je urcite spatne. Je treba to zmenit, ale co bude potom, to tezko rict ;-)
24.11.2009 22:08 Leoš Literák | skóre: 74 | blog: LL | Praha
Rozbalit Rozbalit vše Re: jak odfiltrovat radky se stejnou hodnotou
Tak uz mame vysledek: 52 sekund na prvni spusteni, neco pres sekundu na dalsi spusteni. Porovnani vysledku pred a po ukazuje nespravnost dotazu, ocekaval jsem odstraneni 13. radku, misto toho je mnozina vysledku zmenena na vetsine pozic. Nevidim v datech logiku, jak je vybira. Dekuju za pomoc, zkusim to v jave.
Zakladatel tohoto portálu. Twitter, LinkedIn, blog, StackOverflow
25.11.2009 13:38 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: jak odfiltrovat radky se stejnou hodnotou
otázka: kedy sa jedná o tapetovanie? chceš odstrániť všetky rovnaké príspevky jednoho autora alebo viacerých ? v sekvencii za sebou alebo každý deň ?
25.11.2009 20:08 Leoš Literák | skóre: 74 | blog: LL | Praha
Rozbalit Rozbalit vše Re: jak odfiltrovat radky se stejnou hodnotou
Z duvodu jednoduchosti bude platit jeden zapisek od uzivatele. Nicmene mam schizu, byl jsem presvedcen, ze jsem to uz mel nasazeno, ale nakoukanim do svn jsem tuto funkcnost nenasel.
Zakladatel tohoto portálu. Twitter, LinkedIn, blog, StackOverflow
26.11.2009 12:01 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: jak odfiltrovat radky se stejnou hodnotou
vytiahni si všetky texty od separátnej tabuľky, pridaj k nim hash, napr: sha1 (join ('-', userid, text)). v tejto tabuľke eviduj id prvého/posledného príspevku a v tabuľke s príspevkami nahraď text referenciou do tejto tabuľky a výskyt kontroluj podmienkou. "id = id".

hash môžeš upraviť podľa potreby, takisto prvý/posledný príspevok môžeš vytiahnuť do ďalšej tabuľky.
24.11.2009 10:35 FooBar
Rozbalit Rozbalit vše Re: jak odfiltrovat radky se stejnou hodnotou
Jaky databazovy server? Jsem pred prvnim kafem a zadani jsem jenom prolitnul, ale prijde mi, ze presne to co hledas je nejaky tvuj lokalni ekvivalent DISTINCT ON (expression), http://www.postgresql.org/docs/current/interactive/sql-select.html
24.11.2009 10:38 Leoš Literák | skóre: 74 | blog: LL | Praha
Rozbalit Rozbalit vše Re: jak odfiltrovat radky se stejnou hodnotou
Zakladatel tohoto portálu. Twitter, LinkedIn, blog, StackOverflow
1.12.2009 21:40 kvutza | skóre: 2
Rozbalit Rozbalit vše Re: jak odfiltrovat radky se stejnou hodnotou
Přijde mi, že obdobný problém je svižně řešen pro PostgreSQL na "Last order for each" pomocí DISTINCT ON a rozepsané složitěji pro těžkopádnější systémy na "Last order for each" pro MySQL, ...
2.12.2009 11:22 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: jak odfiltrovat radky se stejnou hodnotou
Píšu, protože nechápu proč GROUP BY a následné ORDER BY by měl vracet kolekci jinak setříděnou.
Protože se mi špatně čte spojování tabulek bez JOINu, tak sem si to přepsal (snad dobře).
Toto by mělo vrátit to co před tím, ale jen po jednom příspěvku od S.Pridal.
SELECT S.pridal,MAX(R.cislo) AS cisloPosledni,MIN(R.cislo) AS cisloPrvni FROM relace AS R
  INNER JOIN polozka  AS P ON R.typ_potomka='P' AND P.typ=12 AND P.cislo=R.potomek
  INNER JOIN spolecne AS S ON S.cislo=R.potomek AND S.typ='P' AND S.vytvoreno<=now()
   GROUP BY S.pridal ORDER BY S.vytvoreno DESC LIMIT 0,15
Což by mohlo být původní
SELECT S.pridal,MAX(R.cislo) AS cisloPosledni,MIN(R.cislo) AS cisloPrvni FROM polozka P, relace R, spolecne S WHERE
P.typ=12 and
P.cislo=R.potomek and
typ_potomka='P' and
S.typ='P' and
S.cislo=R.potomek AND
S.vytvoreno<=now()
GROUP BY S.pridal
  ORDER BY S.vytvoreno DESC LIMIT 0,15 
Omlouvám se jestli mi něco uniklo a nepobral jsem to…
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
2.12.2009 12:39 kulik
Rozbalit Rozbalit vše Re: jak odfiltrovat radky se stejnou hodnotou
Bohuzel nerozumim k cemu prispevek smeruje. Dotaz vybira pro uzivatele minimalni a maximalni cislo relace. Jakou to ma souvislost s problemem posledniho prispevku uzivatele? Trideni podle S.vytvoreno by melo podle mne vyhodit chybu ve smyslu "not a group by expression", nicmene mysql nepouzivam, mozna to nejak zkousne (ale jak by to pak setridilo to fakt netusim).
2.12.2009 12:56 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: jak odfiltrovat radky se stejnou hodnotou
Sorry, nepobral jsem to, špatně jsem pochopil tabulku relace (i když je i pojmenována víc než výstižně).

»Jsem si jist, že odpověď je správná, jen otázka byla položena chybně.« :)
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
2.12.2009 15:11 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: jak odfiltrovat radky se stejnou hodnotou
Nicméně bych to rád pobral (ani nechci najít řešení, ale pochopit vo co go :) ), původní dotaz selectuje roj R.cislo, které odpovídají více zápiskům.
(Neznám konkrétní využití, ale předpokládám, že původní dotaz je kompletní a je třeba vrátit to co je v něm napsáno).
A požadavek byl je omezit 1× na uživatele definového S.pridal.
A protože nevím jestli 1. nebo poslední příspěvek a protože záznamy v relace mají primární index jako autoincrement a je to pole cislo, tak jsem předpokládám, že nejvyšší cislo na daného uživatele je poslední záznam a nejnižší 1. záznam.
Proto selectovací dotaz (pokud je správně) vybere tu množinu záznámů uvedenou v původním SQL dotazu a seskupí záznamy dle uživatele a ke každému záznamu vrátí cislo prvního a posledního záznamu relace.
Kde jsem se dostal mimo zadání ? - dík
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
2.12.2009 16:05 kulik
Rozbalit Rozbalit vše Re: jak odfiltrovat radky se stejnou hodnotou
Co treba si precist celou diskusi:
Neplati, dulezitejsi je S.vytvoreno. Blogy je totiz mozne schedulovat / odkladat, takze treba zapisek vytvoris v lednu, ale publikujes jej az v unoru. Zapisky z konce ledna budou tedy starsi, prestoze maji vyssi id.
2.12.2009 17:45 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: jak odfiltrovat radky se stejnou hodnotou
Chybný předpoklad :) - četl jsem celou diskuzi, ALE upjal jsem se na problém definovaný na začátku a tato informace mi nepřipadla důležitá, ale když jsem se zanořil je přímo fatální…

Vzhledem k datovému modelu a zadání, bych volil jednoznačně aplikační řešení nebo řešení přes SQL fci.
Nechat to jak je (SQL dotaz) nebo dotaz optimalizovat a projel to celé, s tím, že vypsat jen ty 1. záznamy (třeba přes pomocnou tabulku evidovaných S.pridal)

S kolegou jsme zrobily tento výkonný fujtajbl,
vracející jeden záznam R.cisla,
pro každého uživatele S.pridal
a to poslední dle S.vytvoreno (... teda doufám):
SELECT Max(RR.cislo) as poslednicislo FROM
        (SELECT S.pridal, MAX(S.vytvoreno) AS maxvytvoreno FROM relace AS R
                INNER JOIN polozka  AS P ON R.typ_potomka='P' AND P.typ=12 AND P.cislo=R.potomek
                INNER JOIN spolecne AS S ON S.cislo=R.potomek AND S.typ='P' AND S.vytvoreno<=NOW()
              GROUP BY S.pridal
              ORDER BY Max(S.vytvoreno) DESC
        ) AS RPS
        INNER JOIN spolecne as SS ON SS.pridal = RPS.pridal AND SS.vytvoreno = RPS.maxvytvoreno
        INNER JOIN relace as RR ON RR.typ_potomka='P'AND RR.potomek=SS.cislo
            GROUP BY SS.pridal LIMIT 0,15
POZOR: Pokud uživatel vložil více příspěvků v čase 1 sec. - smůla - budou tam všechny
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
2.12.2009 18:07 kulik
Rozbalit Rozbalit vše Re: jak odfiltrovat radky se stejnou hodnotou
Myslim ze problem byl uz vyresen, lepe receno SQL reseni v principu navrzeno (tazatel se to nakonec rozhodl udelat proceduralne, coz je podle mne rozumne). Order by klauzule ve vnorenem dotazu nema smysl, naopak chybi "na konci". Vzhledem ke grupovani dle ss.pridal je vylouceno, ze by mel jeden uzivatel ve vystupu vice zaznamu bez ohledu na to, kolik existuje zaznamu zadanych ve stejnem case (tzn. tve varovani pred timto je mylne). Pokud vubec bude tento dotaz fungovat, vybere posledni prispevky patnacti "nahodnych" uzivatelu, nikoliv poslednich patnact prispevku od ruznych uzivatelu.
2.12.2009 18:31 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: jak odfiltrovat radky se stejnou hodnotou
Ad. vyřešem
není označeno jako vyřešen a zkusím nepovažuji za vyřešeno :)
Ad. Pozor
Ano máte pravdu, (poznámka byla k dotazu, který nebyl publikován)
Ad. Order
na konci order by být nemůže, neni v kolekci a ve vnořeném dotazu zajistí pořadí
Ad. Pokud vubec bude tento dotaz fungovat
No, to nemusí obvykle dotazy skládám nad daty a postupně. (SQL dělám řídce).
Ad. nahodnych uzivatelu
Hledím na to a nemyslím, můžete to zdůvodnit ?
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
3.12.2009 17:29 kulik
Rozbalit Rozbalit vše Re: jak odfiltrovat radky se stejnou hodnotou
Order by musi byt na konci, uvnitr postrada smysl a setrideni vysledku nezajisti - nevim jak to nejak formalne zduvodnit, je to elementarni vlastnost SQL. Pokud na konci "byt nemuze", musi se dotaz upravit tak aby ta m mohl byt.
3.12.2009 21:44 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: jak odfiltrovat radky se stejnou hodnotou
Chtěl jsem zdůvodnit náhodnost, ne třídění ... nicméně není již třeba (vrací to sice nenáhodný výsledek, ale špatný :))

Poznámka k elementární "vlastnosti SQL", aby to někoho neuvedlo v omyl :):
pod-dotaz obecně může ovlivňovat setřídění výsledku např. MySQL5 (mám pocit PostgreSQL od 7.1)
SELECT column2
  FROM (SELECT column2,id FROM t1 ORDER BY column1 DESC) AS tt1
    INNER JOIN t2 ON tt1.id = t2.t1id_fk
 WHERE t2.column42 > 7
Vrací výsledek tříděný dle column1, ale ve výsledku column1 není

či ovlivnit výsledek samotný ... specifické M$SQL (pominu-li chybu historické verze):
SELECT *
 FROM (SELECT TOP 3 FROM t1 ORDER BY column DESC) as tt1
 ORDER BY column ASC
Vrací 3 poslední (dle column) záznamy z t1 setříděné dle column vzestupně
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
3.12.2009 06:43 Leoš Literák | skóre: 74 | blog: LL | Praha
Rozbalit Rozbalit vše Re: jak odfiltrovat radky se stejnou hodnotou
Diky za pokus, ale nevrati ani jeden radek z puvodniho vysledku. Ty relace jsou nejake nahodne, vetsina z nich je velmi starych.
Zakladatel tohoto portálu. Twitter, LinkedIn, blog, StackOverflow
3.12.2009 09:31 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: jak odfiltrovat radky se stejnou hodnotou
Tý-jo, Praha a 6:43 :) (to porušuje pravidlo, do Brna volej po osmé do Prahy po deváté :) )
Mně to vrátilo 0 záznamů, bo mám databázi prázdnou :)
Takže předchozí příspěvek o náhodnosti nekeceal :(
Abych si to ujasnil původní dotaz když se přepíše by vypadal takto:
To by mělo vrátit stejnou skupinu jako původní dotaz (a možná rychleji) - je tak ?, nemám chybu již zde ?
SELECT R.cislo FROM relace AS R
  INNER JOIN polozka  AS P ON R.typ_potomka='P' AND P.typ=12 AND P.cislo=R.potomek
  INNER JOIN spolecne AS S ON S.cislo=R.potomek AND S.typ='P' AND S.vytvoreno<=now()
     ORDER BY S.vytvoreno DESC LIMIT 0,15
Pokud předcházející platí, chyba je (u mě) v následujícím ... kde ? :)
Takto získaná kolekce hodnot R.cislo je třeba omezit tak, aby tam byl jen 1× záznam pro S.Pridal a kolekce byla stále setříděná dle S.vytvoreno
Výsledkem filtrování jen na jeden záznam pro S.Pridal má být záznam s nejvyšším datem S.vytvoreno (ale S.vytvoreno je zároveň <=NOW()).
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
3.12.2009 13:53 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: jak odfiltrovat radky se stejnou hodnotou
Poslední pokus (od kolegy):
SELECT X.MaxCislo 
   FROM (SELECT Max(RR.cislo) as Maxcislo
      FROM ( SELECT S.pridal, Max(S.vytvoreno) as lastpublished
              FROM relace AS R
              INNER JOIN polozka  AS P ON R.typ_potomka='P' AND P.typ=12 AND P.cislo=R.potomek
              INNER JOIN spolecne AS S ON S.cislo=R.potomek AND S.typ='P' AND S.vytvoreno<=now() GROUP BY S.pridal
            ) as F
            INNER JOIN spolecne AS SS ON SS.typ='P' AND SS.vytvoreno<=now() AND SS.pridal = F.pridal AND SS.vytvoreno = F.lastpublished
            INNER JOIN relace AS RR ON RR.typ_potomka = 'P' AND RR.potomek = SS.cislo
            INNER JOIN polozka AS PP ON PP.typ=12 AND PP.cislo=RR.potomek
              GROUP BY F.pridal
        ) AS X
    INNER JOIN relace RRR ON X.Maxcislo = RRR.cislo
    INNER JOIN spolecne as SSS ON RRR.potomek = SSS.cislo AND SSS.typ = 'P'
  ORDER BY SSS.vytvoreno DESC LIMIT 0,15
Tímto končím :)
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
4.12.2009 15:58 fanda
Rozbalit Rozbalit vše Re: jak odfiltrovat radky se stejnou hodnotou
Zkusím také nějaký návrh, ale jen teoreticky.

Pokud potřebuješ unikátní pridal, vyšel bych z tabulky autorů (tu tam nemáš uvedenou, ale předpokládám, že existuje), kde je právě každý autor jen jednou.

A ke každému autorovi bych pomocí vnořeného selectu dotáh jeho nejnovější záznam vyhovující podmínkám. Tedy vpodstatě tvůj select z původního dotazu ofiltrovaný navíc na pridal=autor, seřazený dle vytvoreno sestupne a limit 1

Tento výsledek bych seřadil dle vytvoreno sestupne s limitem 15.

Z hlavy nedám teď SQL dohromady, já to zas tak často nepoužívám a nemám syntaxi v hlavě.

Jen nástin: SELECT a.autor, (SELECT cislo, vytvoreno WHERE ...... S.pridal=A.autor ORDER BY vytvoreno DESC LIMIT 1) ORDER BY vytvoreno DESC LIMIT 15

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267   www.czech-server.cz
© 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.