Portál AbcLinuxu, 22. července 2025 16:24


Dotaz: mysql 3.23 slozeny dotaz

8.2.2009 19:18 Dušan Hokův | skóre: 43 | blog: Fedora a další...
mysql 3.23 slozeny dotaz
Přečteno: 575×
Odpovědět | Admin
Zdravim, pokousim se z jedne tabulky poscitat pocet komentaru k jednotlivym clankum a pote do tabulky clanku aktualizovat pocet komentaru. Potrebuji poradit co je spatne:
UPDATE nuke_stories_zal set comments.nuke_stories_zal=soucet where sid.nuke_stories_zal IN
(
SELECT COUNT(sid) AS soucet, sid FROM nuke_comments GROUP BY sid
)
Spodni cast samostatne funguje a vraci tabulku se sloupci soucet a sid.

Predem diky za pomoc.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

9.2.2009 09:28 razor | skóre: 33
Rozbalit Rozbalit vše Re: mysql 3.23 slozeny dotaz
Odpovědět | | Sbalit | Link | Blokovat | Admin

Není problem v tom, že 3.23 neumí poddotaz ?

9.2.2009 18:55 Dejv | skóre: 37 | blog: Jak ten blog nazvat ... ? | Ostrava
Rozbalit Rozbalit vše Re: mysql 3.23 slozeny dotaz
Odpovědět | | Sbalit | Link | Blokovat | Admin
Ja bych rekl, ze problem je bud v #1 nebo proste v tom, ze selectem sice poscitas pocty komentaru, ale UPDATE nevi, ktery pocet patri ke kteremu clanku (nema vazbu mezi nuke_comments.sid a nuke_stories_zal.comments). Zkusil bych neco jako
UPDATE nuke_stories_zal SET nuke_stories_zal.comments = count(nuke_comments.sid)
FROM nuke_comments
     JOIN nuke_stories_zal ON nuke_stories_zal.sid = nuke_comments.sid
GROUP BY nuke_comments.sid
A krom toho mas v set a where IMHO prehozene jmena sloupcu a tabulek :-)

Dejv
Pevně věřím, že zkušenější uživatelé mě s mými nápady usměrní a pošlou tam, kam tyto nápady patří...
default avatar 10.2.2009 10:01 default | skóre: 22 | Madrid
Rozbalit Rozbalit vše Re: mysql 3.23 slozeny dotaz

Ty vole! Já chci taky databázi, která umí klauzili FROM v UPDATE statementu. :-D

10.2.2009 21:37 Dejv | skóre: 37 | blog: Jak ten blog nazvat ... ? | Ostrava
Rozbalit Rozbalit vše Re: mysql 3.23 slozeny dotaz
Ja netvrdim, ze MySQL 3.23 toto umi, mozna jsem opravdu strelil hodne mimo. Ale ten update ... from ... join neni z moji hlavy - MSSQL to umi a tam jsem se s tim taky setkal poprve. A taky jsem na to hledel jak tele na nove vrata.

Pr.:
update d 
	set d.typ_uhrady = nova_hodnota
	from #davka d
		join #faktur f on f.id_poj = d.id_poj and f.id_icz = d.id_icz
	where f.akce = 'ZMEN_TYP_UHRADY'
A taky
delete d
	from #davka d 
		join #fakt f on f.id_poj = d.id_poj
	where f.akce = 'NEFAKTURUJ'
Mozna to je nejaky "MS-standard", to nevim. Ale urcite to neni k zahozeni. Updatovat jednu tabulku podle podminky na jine tabulce... A o to mi slo v me odpovedi - on proste IMHO potrebuje ty tabulky nejak spojit.

Dejv
Pevně věřím, že zkušenější uživatelé mě s mými nápady usměrní a pošlou tam, kam tyto nápady patří...
AraxoN avatar 11.2.2009 00:02 AraxoN | skóre: 47 | blog: slon_v_porcelane | Košice
Rozbalit Rozbalit vše Re: mysql 3.23 slozeny dotaz

Tak si spusť postgres! ;-)

default avatar 10.2.2009 09:57 default | skóre: 22 | Madrid
Rozbalit Rozbalit vše Re: mysql 3.23 slozeny dotaz
Odpovědět | | Sbalit | Link | Blokovat | Admin
Příloha:

No, já nevím. Podle mě ten dotaz fungovat nemůže, protože je tak trošku syntakticky špatně:

UPDATE nuke_stories_zal
SET
    comments.nuke_stories_zal = soucet
WHERE
    sid.nuke_stories_zal IN (SELECT
                COUNT(sid) AS soucet,
                sid
            FROM
                nuke_comments
            GROUP BY
                sid)

 Jak je vidět z přepisu:

  1. SELECT statement v IN klauzuli vrací dva sloupce, přestože levý operand má sloupec jen jeden
  2. v SET klauzuli se UPDATE statement odkazuje na tabulku (nebo alias tabulky) COMMENTS, která není definovaná
  3. neznám strukturu tabulky NUKE_STORIES_ZAL, ale sloupec SOUCET v ní patrně neexistuje a patrně to má být odkaz na sloupec v korelovaném poddotazu

Správně ten dotaz má být:

UPDATE stories s
SET
    s.story_comments_cnt = (SELECT
                COUNT(1)
            FROM
                comments cmnts
            WHERE
                cmnts.story_id = s.story_id)
/

V příloze je celý skript (struktura plus testovací data). Hodně štěstí.

10.2.2009 10:46 neaktivni | skóre: 24 | blog: neaktivni
Rozbalit Rozbalit vše Re: mysql 3.23 slozeny dotaz
No Váš skript sice vypada přehledně, ale pro praktické použití bych určitě dal přednost JOINu. Tipuji, že bude výrazně rychlejší, pokud si ten váš dotaz db engine sám nezoptimalizuje do JOINu.
default avatar 10.2.2009 16:25 default | skóre: 22 | Madrid
Rozbalit Rozbalit vše Re: mysql 3.23 slozeny dotaz

A můžeme poprosit o příklad? Klidně to může být také nějaký skript :-)

14.2.2009 14:34 Smajchl | skóre: 39 | blog: Drzy_Nazory | Praha
Rozbalit Rozbalit vše Re: mysql 3.23 slozeny dotaz
V takovymhle pripade mam u MySQL opacnou zkusenost, join je nekolikrat pomalejsi... a left join je uplne nejpomalejsi.
My máme všechno co chcem, my máme dobrou náladu!
talpa avatar 17.2.2009 14:49 talpa | skóre: 2 | Praha 4
Rozbalit Rozbalit vše Re: mysql 3.23 slozeny dotaz

to bude tim ze mysql je pseudodatabaze, jsem zkousel v 5tce delat storky, co ta db delala to by jeden neveril....a hlavne mela problem s backupem dokonce zapominala ze ma triggery a storky a backupy delala bez :)))) zahodte to..

Tak nejak vse co mi prijde pod ruku
17.2.2009 18:35 Smajchl | skóre: 39 | blog: Drzy_Nazory | Praha
Rozbalit Rozbalit vše Re: mysql 3.23 slozeny dotaz
jj taky mam takovej pocit ze mysql je dobra jen na maly projekty...
My máme všechno co chcem, my máme dobrou náladu!

Založit nové vláknoNahoru

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

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.