Registrace nového uživatele     Návod     Kluby     Archív  Lopuchu     Lopuch.cz  

Diskuze na Lopuchu,
pohlazení na duchu

Lopuch.cz

Jméno:
Heslo:
Podpora LCD:
 
Klub Database (mysql,...) [ŽP: neomezená] (kategorie Programování) moderuje melkor_unlimited.
Archiv
  Nastavení klubu     Nastavení práv     Homepage     Anketa     Přítomní     Oblíbené     Lopuch     Kategorie  
autor: 
text: 
vyplnit a 
Help
 Titulek, text příspěvku  
Opište pozpátku následující text bez prostředního znaku: txtveul
[ 1008 ] <Novější  <<<Nejnovější  Nejstarší>>>  Starší>  
tvx tvx Myslet si, že svět je JEN takový, jak - ho v daný čas můžeme pochopit je hloupé. 7.9.2007 09:03  539
jsem dneska nejakej zabrzdenej... nevim kterak efektivne na toto:
mam tabulku ID1,ID2, kde je ID1 ku ID2 ve vztahu N:N...
tedy neco jako:
10,20
10,30
10,40
20,40
20,15
potrebuju vybrat takovy ID1, ktery maj jako ID2 u sebe urcitej vycet ID2...
bredy 14.8.2007 09:02  538
huhNo řekl bych, že je to naprosto stejný dotaz. Jen využívá podquery. Obecně nám ve škole štěpovali do hlavy, že subquery jsou obecně pomalější než obyčejné JOIN. Ale nezkoušel jsem, mohu to vyzkoušet. Nicméně jak říkám, je to 1:1 a navíc si nedokážu představit, jak rychlé bude hledat NOT IN v množině čítající desetitisíce záznamů.
straka82 Straka82 12.8.2007 13:21  536
mach no ja to prave nechtel pomoci toho vnorenyho, to sem tu dal jen jako inspiraci, abyste vedeli, co vlastne chci :-)

No ale asi to jinak nepujde, tak to tak udelam, diky
mach 12.8.2007 13:12  535
Straka82select sum(a) from (select a from tabulka order by date desc limit 0,3) x;

Vnoreny select musi byt pojmenovany.
straka82 Straka82 12.8.2007 13:02  534
jak zjistim sumu poslednich tri hodnot u nejakyho atributu?

chci udelat neco takovyho: select sum(a) from (select a from tabulka order by date desc limit 0,3);

nejak jednoduse, diky :)
makak makak 9.8.2007 21:01  533
BredyOmlouvam se, pokud to vyznelo, ze znam nejaky principialne lepsi zpusob cehokoliv. Ja jsem ani nezkoumal, co vlastne tvuj prikaz dela. Jen se mi zdal "podezrely", tak jsem si ho "prepsal" na not exist, se kterym si muj mozek uz poradil lepe. Zapis pomoci not exists mi prijde jednodussi (na pochopeni), nebot si ho mohu snadneji prevest do bezne reci, tot vse. Samozrejme, jak jsem napsal, pri dobre optimalizaci prekladu SQL by mela databaze provest tytez ukony.
huh huh 6.8.2007 16:37  532
Bredy [531]: a huh [500] jsi zkousel?
bredy 6.8.2007 15:03  531
makakNo vis li o SQL dotazu, ktery najde prvni neexistujici ID v seznamu, sem s nim! Ptal jsem se na to nedávno nikdo mi nenapsal nic kloudného.
makak makak 6.8.2007 11:27  530
Hm, mne prijde hlavne trochu z cesty pouzit left join a pak vysledek omezit na nesplneny join, kdyz se to mnohem logicteji da napsat pomoci not exists. Ale samozrejme ve vysledku je to jedno a dalsi dukaz o pomerne neschopnosti optimalizace prekladacu SQL. O nutnosti pripravit vicero variant tehoz SQL pro DB2, aby se ukazalo, ktera je vyhodnejsi, bych mohl dlouho nastvane vykladat :-(
pepak pepak - Pepak.net 6.8.2007 11:07  529
Ne ze bych to cekal, ale az tak moc me to neprekvapuje - pripada mi to jako varianta na stare dobre ASC vs DESC.
bredy 6.8.2007 10:40  528
Taková perličkaAž budete optimalizovat databázi:

SELECT tb1.job_id+1 FROM `finished_jobs` AS tb1 LEFT JOIN `finished_jobs` AS tb2 ON tb2.job_id-1 = tb1.job_id WHERE ISNULL(tb2.job_id) AND tb1.job_id >= 48477 LIMIT 1;
+--------------+
| tb1.job_id+1 |
+--------------+
|        57259 | 
+--------------+
1 row in set (3 min 18.37 sec)

SELECT tb1.job_id+1 FROM `finished_jobs` AS tb1 LEFT JOIN `finished_jobs` AS tb2 ON tb2.job_id = tb1.job_id+1 WHERE ISNULL(tb2.job_id) AND tb1.job_id >= 48477 LIMIT 1;
+--------------+
| tb1.job_id+1 |
+--------------+
|        57259 | 
+--------------+
1 row in set (0.00 sec)

Povšiměte si, jak úprava podmínky v klauzuli ON - převedení jedničky na druhou stranu rovnice - má vliv na výkon.

Podotýkám, že job_id je primární klíč. V tabulce jsou uložena čísla od 48477 a výš kontinuálně, jen číslo 57259 chybí
edmundl 18.7.2007 22:04  527
Straka, to neřeš. ta db už je hotová a já nad ní stavím jen klienta bez možnosti nějak výrazně ovlivnit strukturu db.
makak: díky za nakopnutí.
straka82 Straka82 18.7.2007 21:57  526
Jo vlastne, podle toho prikladu to ma byt serazeno podle toho drivejsiho v abecede. Stejnak i stojim za resenim pomoci dvou tabulek :-)
straka82 Straka82 18.7.2007 21:54  525
Ja to asi nechapu. Co kdyz v jedne rodine bude clovek se jmenem Zavada a zaroven clovek se jmenem Absolon? Ma se tato rodina obejvit uplne na zacatku seznamu nebo uplne na konci?

Podle me by bylo lepsi to udelat pomoci dvou tabulek, v jedne by byly nejaky "oficialni" jmena tech rodin, treba Absolonovi a v druhe clenove tech rodin.
makak makak 18.7.2007 21:53  524
Prvni ORDER BY udelej pres min(prijmeni) pro danou rodinu, dalsi pak staci prijmeni a jmeno. Jak konkretne ten udaj ziskas, zalezi na konkretnich DB a pozadavcich. Napriklad subselect, inner join s group by nebo predpocitat do tabulky rodina (+ dalsi zpusoby, jak uz to u SQL je zvykem - "totez" se da napsat "ruzne").

[ 1008 ] <Novější  <<<Nejnovější  Nejstarší>>>  Starší>  

(c) 2001-2011 Lopuch.cz   
Kontakt