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í
×
dnes 17:50 | Komunita

Nadace The Document Foundation (TDF) zastřešující vývoj svobodného kancelářského balíku LibreOffice slaví 5 let od svého oficiálního vzniku. Nadace byla představena 28. září 2010. Formálně byla založena ale až 17. února 2012.

Ladislav Hagara | Komentářů: 0
dnes 12:50 | Komunita

Mozilla.cz informuje, že dosud experimentální funkce Page Shot z programu Firefox Test Pilot (zprávička) se stane součástí Firefoxu. Page Shot je nástroj pro vytváření snímků webových stránek. Umí výběr oblasti, prvku stránky (např. odstavce), nebo uložení snímku celé stránky. Snímky lze ukládat na disk nebo nahrávat na server Mozilly. Nedávno bylo oznámeno, že se součástí Firefoxu stane Activity Stream.

Ladislav Hagara | Komentářů: 2
dnes 04:10 | Nová verze

Po 10 týdnech vývoje od vydání Linuxu 4.9 (zprávička) oznámil Linus Torvalds, mj. již 20 let žijící v USA, vydání Linuxu 4.10 (LKML). Přehled nových vlastností a vylepšení například na Kernel Newbies a v Jaderných novinách (1, 2 a 3). Kódové jméno Linuxu 4.10 je Fearless Coyote.

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

Vyzkoušet si příkazy a vyřešit několik úkolů lze na stránkách Commandline Challenge (CMD Challenge). Úkoly lze řešit různými způsoby, důležitý je výsledek. Zdrojové kódy jsou k dispozici na GitHubu pod licencí MIT.

Ladislav Hagara | Komentářů: 16
18.2. 17:35 | Bezpečnostní upozornění

Německá Bundesnetzagentur (obdoba českého ČTU) zakázala na německém území prodej panenky Cayla kvůli „špionáži“ dětí. Tato elektronická hračka obsahuje mikrofon, reproduktor a kameru a bezdrátové komunikační rozhraní, pomocí kterého se hračka připojuje na servery výrobce. Takovýmto způsobem může hračka pomocí umělé inteligence „odpovídat“ na dotazy dítěte. Hlavní problém bude ale asi někde jinde, podle prvotních zpráv může

… více »
Petr Tomášek | Komentářů: 28
17.2. 15:30 | Bezpečnostní upozornění

CSIRT.CZ upozorňuje, že bezpečnostní experti objevili nový typ malwaru, jenž cílí na open source e-commerce platformu Magento. Malware je zajímavý tím, že se jedná o první svého druhu, jehož kód zůstává skrytý v SQL databázi zasaženého e-shopu. Škodlivý kód je volán pomocí tzv. SQL trigerru, který je spouštěn při každém vytvoření objednávky v systému.

Ladislav Hagara | Komentářů: 3
17.2. 09:00 | Nová verze

Bylo vydáno Ubuntu 16.04.2 LTS, tj. druhé opravné vydání Ubuntu 16.04 LTS s kódovým názvem Xenial Xerus. Přehled novinek v poznámkách k vydání a v přehledu změn.

Ladislav Hagara | Komentářů: 56
17.2. 06:00 | Zajímavý článek

Pavel Tišnovský se v dvoudílném článku na MojeFedora.cz věnuje tvorbě pluginů (modulů) pro bitmapový grafický editor GIMP. Pomocí pluginů lze GIMP rozšiřovat o další funkce. Implementovat lze například nové filtry nebo pomocné utility pro tvorbu animací či poloautomatickou retuš snímků.

Ladislav Hagara | Komentářů: 6
16.2. 23:32 | Komunita

Do 30. března se lze přihlásit do dalšího kola programu Outreachy, jehož cílem je přitáhnout do světa svobodného a otevřeného softwaru lidi ze skupin, jež jsou ve světě svobodného a otevřeného softwaru málo zastoupeny. Za 3 měsíce práce, od 30. května do 30. srpna 2017, v participujících organizacích lze vydělat 5 500 USD. Jedná se již o 14. kolo tohoto programu.

Ladislav Hagara | Komentářů: 11
16.2. 23:13 | Nová verze

Byla vydána verze 0.92.1 svobodného multiplatformního vektorového grafického editoru Inkscape. Přehled novinek v poznámkách k vydání. Řešen je mimo jiné problém s verzí 0.92, jež rozbíjí dokumenty vytvořené v předchozích verzích Inkscape. Více v příspěvku na blogu Davida Revoye, autora open source webového komiksu Pepper&Carrot nebo portrétu GNU/Linuxu.

Ladislav Hagara | Komentářů: 0
Jak se stavíte k trendu ztenčování přenosných zařízení (smartphony, notebooky)?
 (13%)
 (2%)
 (72%)
 (3%)
 (10%)
Celkem 666 hlasů
 Komentářů: 53, poslední dnes 18:38
Rozcestník
Reklama

Dotaz: odstraneni duplicit

16.12.2009 10:02 Leoš Literák | skóre: 74 | blog: LL | Praha
odstraneni duplicit
Přečteno: 740×
Zase mam nejaky zapeklity dotaz z redakcaku abicka. Uz dela, co by mel, akorat druhy vnitrni select vraci vice vysledku, proto i celkovy dotaz vraci vice radku, nez bych chtel. Potreboval bych upravit vnitrni subselect, aby vracel jediny radek a to s nejvyssi hodnotou sloupecku cislo u tabuky CT.
select P.cislo, P.numeric1, P.numeric2, P.string1, P.string2, P.data,
        coalesce(counter,0) as counter, kdy, S.pridal, S.skupina, S.prava, R.cislo, contract from
        relace R, spolecne S, polozka P 
          left join (select R1.potomek as autor, count(P1.cislo) as counter, max(S1.vytvoreno) as kdy
                    from polozka P1, relace R1, vlastnost V1, spolecne S1
                    where P1.typ=2 and P1.cislo=V1.predek and V1.typ_predka='P' and V1.typ='author'
                    and R1.typ_potomka='P' and V1.hodnota=R1.cislo and S1.typ='P' and P1.cislo=S1.cislo
                    and S1.vytvoreno < now() group by autor) A on A.autor=P.cislo
          left join (select SCS.pridal as uid, CT.numeric1 as contract from polozka SC, polozka CT, spolecne SCS
                    where SC.typ=31 and CT.typ=30 and SC.numeric1 = CT.cislo and SC.cislo=SCS.cislo and SCS.typ='P' and CT.numeric1<>0
                    ) B on B.uid = P.numeric1
  where P.typ=19 and R.typ_potomka=S.typ and R.potomek=S.cislo and S.typ='P' and S.cislo=P.cislo and P.numeric1 in (1,99,143)
Trochu vysvetleni:
  • hlavni select pres tabulky P, R, S vybira polozky typu autor
  • prvni vnoreny subselect hleda pocet clanku a datum posledniho clanku autora
  • druhy hleda polozku SC spojenou s polozkou CT, kterou vytvoril (SCS.pridal) stejny autor, potrebuji jen radek s nejvetsi hodnotou CT.cislo. Aktualne subselect vraci zadny, jeden nebo vice radku.
Dekuji za radu. Ja nejsem sql guru, jen se snazim rozsirit existujici dotaz o dalsi funcknost.
Zakladatel tohoto portálu. Twitter, LinkedIn, blog, StackOverflow

Odpovědi

16.12.2009 11:35 cronin | skóre: 48
Rozbalit Rozbalit vše Re: odstraneni duplicit
Nieco take?
 SELECT ... ORDER BY CT.cislo DESC LIMIT 1
Ale to sa mi vidi prilis trivialne, asi som nepochopil otazku.
16.12.2009 11:42 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: odstraneni duplicit
LIMIT u MySQL nelze použít v subquery (nepletu-li se) :(
Tímto zpusobem jedině bláznovství:
do WHERE subquery dát podmínku CT.cislo = (SELECT MAX(CT.cislo) ...) a zopakovat tam dotaz.
... ale to je dost ujeté
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
16.12.2009 11:58 Leoš Literák | skóre: 74 | blog: LL | Praha
Rozbalit Rozbalit vše Re: odstraneni duplicit
To jsem zkousel vcetne group by, nicmnéně to dávalo nesmyslné výsledky.
Zakladatel tohoto portálu. Twitter, LinkedIn, blog, StackOverflow
16.12.2009 12:37 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: odstraneni duplicit
Když to Béčko bude takto (to u MySQL lze), tak by to mohlo vrátit jeden záznam, ne ?:
(SELECT SCS.pridal as uid, CT.numeric1 as contract FROM polozka SC, polozka CT, spolecne SCS
  ,(SELECT  MAX(CT.cislo) AS cfuj from polozka SC, polozka CT, spolecne SCS
	                    where SC.typ=31 and CT.typ=30 and SC.numeric1 = CT.cislo and SC.cislo=SCS.cislo and SCS.typ='P' and CT.numeric1<>0) AS tfuj
   WHERE SC.typ=31 and CT.typ=30 and SC.numeric1 = CT.cislo and SC.cislo=SCS.cislo and SCS.typ='P' and CT.numeric1<>0 AND CT.cislo = tfuj.cfuj
     GROUP BY tfuj.cfuj) AS B
Ale o kvalitě bych nehovořil (nebijte mě…)
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
17.12.2009 15:46 Leoš Literák | skóre: 74 | blog: LL | Praha
Rozbalit Rozbalit vše Re: odstraneni duplicit
Díky, ale syntax error. Asi bude řešením změnit datové schéma a předpočítat si tu hodnotu do sloupečku.
Zakladatel tohoto portálu. Twitter, LinkedIn, blog, StackOverflow
17.12.2009 16:06 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: odstraneni duplicit
Hm, mně ta část B normálně projde (samozřejmě bez závorek a AS):
SELECT SCS.pridal as uid, CT.numeric1 as contract FROM polozka SC, polozka CT, spolecne SCS
  ,(SELECT  MAX(CT.cislo) AS cfuj from polozka SC, polozka CT, spolecne SCS
	                    where SC.typ=31 and CT.typ=30 and SC.numeric1 = CT.cislo and SC.cislo=SCS.cislo and SCS.typ='P' and CT.numeric1<>0) AS tfuj
   WHERE SC.typ=31 and CT.typ=30 and SC.numeric1 = CT.cislo and SC.cislo=SCS.cislo and SCS.typ='P' and CT.numeric1<>0 AND CT.cislo = tfuj.cfuj
     GROUP BY tfuj.cfuj
a kompletní dotaz:
select P.cislo, P.numeric1, P.numeric2, P.string1, P.string2, P.data,
        coalesce(counter,0) as counter, kdy, S.pridal, S.skupina, S.prava, R.cislo, contract from
        relace R, spolecne S, polozka P
          left join (select R1.potomek as autor, count(P1.cislo) as counter, max(S1.vytvoreno) as kdy
                    from polozka P1, relace R1, vlastnost V1, spolecne S1
                    where P1.typ=2 and P1.cislo=V1.predek and V1.typ_predka='P' and V1.typ='author'
                    and R1.typ_potomka='P' and V1.hodnota=R1.cislo and S1.typ='P' and P1.cislo=S1.cislo
                    and S1.vytvoreno < now() group by autor) A on A.autor=P.cislo
          left join (SELECT SCS.pridal as uid, CT.numeric1 as contract FROM polozka SC, polozka CT, spolecne SCS
                        ,(SELECT  MAX(CT.cislo) AS cfuj from polozka SC, polozka CT, spolecne SCS
                      	                    where SC.typ=31 and CT.typ=30 and SC.numeric1 = CT.cislo and SC.cislo=SCS.cislo and SCS.typ='P' and CT.numeric1<>0) AS tfuj
                         WHERE SC.typ=31 and CT.typ=30 and SC.numeric1 = CT.cislo and SC.cislo=SCS.cislo and SCS.typ='P' and CT.numeric1<>0 AND CT.cislo = tfuj.cfuj
                           GROUP BY tfuj.cfuj) AS B
 on B.uid = P.numeric1
  where P.typ=19 and R.typ_potomka=S.typ and R.potomek=S.cislo and S.typ='P' and S.cislo=P.cislo and P.numeric1 in (1,99,143)
taky.

Samozřejmně nad prázdnou db na verzi 5.0.67.

No ono asi je něco ne úplně OK v datovém modelu, pokud to nutí dělat takovéto dotazy :), ale neznám, pozadí jak to vznikalo a ani jsem to nijak nestudoval, takže si netroufám hodnotit - jen pocit na základě, již druhého podobného dotazu.

To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
17.12.2009 19:37 Leoš Literák | skóre: 74 | blog: LL | Praha
Rozbalit Rozbalit vše Re: odstraneni duplicit

Tak castecny uspech, pro jednoho uzivatele to ale vraci NULL. Trochu jsem to rozkouskoval / zkratil:

SELECT SCS.pridal as uid, CT.numeric1 as contract, CT.cislo FROM polozka SC, polozka CT, spolecne SCS 
WHERE SC.typ=31 and CT.typ=30 and SC.numeric1 = CT.cislo and SC.cislo=SCS.cislo and SCS.typ='P' and CT.numeric1<>0;

1;-1;147251
99;-1;147251
99;1;147269

SELECT  MAX(CT.cislo) AS cfuj from polozka CT where CT.typ=30 and CT.numeric1<>0;

147269

Cely subselect vraci:

99;1

Jdu si hrat dal

Zakladatel tohoto portálu. Twitter, LinkedIn, blog, StackOverflow
17.12.2009 20:03 Leoš Literák | skóre: 74 | blog: LL | Praha
Rozbalit Rozbalit vše Re: odstraneni duplicit
Ten select MAX vrati jediny radek, proto to nemuze fungovat. Asi by to chtelo prepsat na subselect ..
Zakladatel tohoto portálu. Twitter, LinkedIn, blog, StackOverflow
17.12.2009 22:39 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: odstraneni duplicit
Toš to jsem se fčul ztratil… :),
A o to jde, ne ? dle "potrebuji jen radek s nejvetsi hodnotou CT.cislo"

Do zjednodušení dotazu jsem nešel, bo jsem úplně přesně dle db a požadavku nepronikl do app. vrstvy a db struktury.

To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
17.12.2009 22:56 Leoš Literák | skóre: 74 | blog: LL | Praha
Rozbalit Rozbalit vše Re: odstraneni duplicit
.. potrebuji jen radek s nejvetsi hodnotou CT.cislo daneho uzivatele.

Polozka CT je navrh smlouvy, muze jich existovat vice. Autori podepisi navrh smlouvy, cimz vznikne polozka SC. V systemu muze byt vice CT, ke kterym bude n SC. CS.numeric1 obsahuje primarni klic CT. Dotaz vypisuje vsechny autory, doplnuju hodnotu CT.numeric1 z posledniho CT, na ktere existuje SC pro daneho autora, pokud zadne SC neexistuje, ma tam byt NULL.
Zakladatel tohoto portálu. Twitter, LinkedIn, blog, StackOverflow
17.12.2009 23:07 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: odstraneni duplicit
To je asi víc informací než bych fčul na klidné spaní chtěl :)
A nastačí jen odstranit toto GROUP BY tfuj.cfuj - jen tak vařím…
tj. (bez optimalizace):
select P.cislo, P.numeric1, P.numeric2, P.string1, P.string2, P.data,
        coalesce(counter,0) as counter, kdy, S.pridal, S.skupina, S.prava, R.cislo, contract from
        relace R, spolecne S, polozka P
          left join (select R1.potomek as autor, count(P1.cislo) as counter, max(S1.vytvoreno) as kdy
                    from polozka P1, relace R1, vlastnost V1, spolecne S1
                    where P1.typ=2 and P1.cislo=V1.predek and V1.typ_predka='P' and V1.typ='author'
                    and R1.typ_potomka='P' and V1.hodnota=R1.cislo and S1.typ='P' and P1.cislo=S1.cislo
                    and S1.vytvoreno < now() group by autor) A on A.autor=P.cislo
          left join (SELECT SCS.pridal as uid, CT.numeric1 as contract FROM polozka SC, polozka CT, spolecne SCS
                        ,(SELECT  MAX(CT.cislo) AS cfuj from polozka SC, polozka CT, spolecne SCS
                      	                    where SC.typ=31 and CT.typ=30 and SC.numeric1 = CT.cislo and SC.cislo=SCS.cislo and SCS.typ='P' and CT.numeric1<>0) AS tfuj
                         WHERE SC.typ=31 and CT.typ=30 and SC.numeric1 = CT.cislo and SC.cislo=SCS.cislo and SCS.typ='P' and CT.numeric1<>0 AND CT.cislo = tfuj.cfuj) AS B
 on B.uid = P.numeric1
  where P.typ=19 and R.typ_potomka=S.typ and R.potomek=S.cislo and S.typ='P' and S.cislo=P.cislo and P.numeric1 in (1,99,143)
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
18.12.2009 18:07 Leoš Literák | skóre: 74 | blog: LL | Praha
Rozbalit Rozbalit vše Re: odstraneni duplicit
Zadna zmena. Furt je tam null.
Zakladatel tohoto portálu. Twitter, LinkedIn, blog, StackOverflow
17.12.2009 16:27 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: odstraneni duplicit
nie do stĺpčeku, ale do extra tabuľky s typom. To ti umožní zmeniť v budúcnosti variabilitu, napr "zmena výpočtu bez výpadku", "rôzne podmienky pre rôzne situácie".
17.12.2009 16:40 Leoš Literák | skóre: 74 | blog: LL | Praha
Rozbalit Rozbalit vše Re: odstraneni duplicit
Ve schématu je už pro podobné účely tabulka vlastnost, ale je to jen dvojice klíč: hodnota, string.
Zakladatel tohoto portálu. Twitter, LinkedIn, blog, StackOverflow
17.12.2009 16:52 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: odstraneni duplicit
Môže byť. No pre kľúč aj hodnotu by som navrhoval extra tabuľku. Predsa len, typ int4 resp int8 je na porovnanie jednoduchší ako typ string.
19.12.2009 00:32 Leoš Literák | skóre: 74 | blog: LL | Praha
Rozbalit Rozbalit vše Re: odstraneni duplicit
Tak jsem vytvoril nove sloupecky a za chvilku to bylo hotovo, subquery byla primitivni. Do nejakych vetsich uprav schematu se mi nechce, delam nad vetvi a tak nemam chut psat migracni skripty nad spoustou objektu v databazi. Tohle branne cviceni si necham na jindy.
Zakladatel tohoto portálu. Twitter, LinkedIn, blog, StackOverflow
19.12.2009 08:43 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: odstraneni duplicit
existuje jednoduchšie riešenie :-) vytvoriť novú tabuľku "vlastnosti_background", miesto "vlastnosti" vytvoriť view a pridať k nemu správne triggre / rules / ... čo ktorá databáza potrebuje. Triviálne, ak človek SQL generuje (napr XML + XSLT) :-)
19.12.2009 22:18 Leoš Literák | skóre: 74 | blog: LL | Praha
Rozbalit Rozbalit vše Re: odstraneni duplicit

Prepis jsem odladil, uz zase vse funguje, dokonce tento dotaz vraci vysledky, jak ma. Jen jsem chtel podle noveho sloupecku filtrovat a z nejakeho divneho duvodu si mysql stezuje, ze to nejde, ze sloupecek status nezna.

select P.cislo, P.numeric1, P.boolean1, P.string1, P.string2, P.data, coalesce(counter,0) as counter, kdy, S.pridal, S.skupina, S.prava, R.cislo, 
(select CT.boolean2 from polozka CT where CT.cislo=P.numeric2) as status 
from relace R join spolecne S on R.typ_potomka=S.typ and R.potomek=S.cislo join polozka P on S.typ='P' and S.cislo=P.cislo left join 
(select R1.potomek as autor, count(P1.cislo) as counter, max(S1.vytvoreno) as kdy from polozka P1, relace R1, vlastnost V1, spolecne S1 
where P1.typ=2 and P1.cislo=V1.predek and V1.typ_predka='P' and V1.typ='author' and R1.typ_potomka='P' and V1.hodnota=R1.cislo and 
S1.typ='P' and P1.cislo=S1.cislo and S1.vytvoreno < now() group by autor) A 
on A.autor=P.cislo where P.typ=19 AND status=1 ORDER BY string2 ASC;

Chyba zni:

Unknown column 'status' in 'where clause'

Nedava i to smysl, nastudoval jsem mysql dokumentaci k subselectum a nepisou, ze by to nemelo jit. Dokazu filtrovat podle vsech sloupecku mimo tento ze subselectu. Proc?

Zakladatel tohoto portálu. Twitter, LinkedIn, blog, StackOverflow
19.12.2009 22:34 Leoš Literák | skóre: 74 | blog: LL | Praha
Rozbalit Rozbalit vše Re: odstraneni duplicit
Update: prepsal jsem ten subselect na left join a stejne to nefungovalo. Musel jsem prestat pouzivat alias a v podmince natvrdo napsat jmeno sloupecku. Je zakazano pouzivat aliasy v podmince, skoda.
Zakladatel tohoto portálu. Twitter, LinkedIn, blog, StackOverflow
20.12.2009 14:43 kulik
Rozbalit Rozbalit vše Re: odstraneni duplicit
Mozna je to skoda, ale je to velmi logicke. Nejprve se urci mnozina vysledku a pak se pro ni teprve dohleda ta hodnota subselectem.

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.