DevProTalk

DevProTalk (http://www.devprotalk.com/index.php)
-   SQL baze podataka - Sponzor: Baze-Podataka.net (http://www.devprotalk.com/forumdisplay.php?f=10)
-   -   Po 1 najnovija iz svake kategorije (http://www.devprotalk.com/showthread.php?t=1323)

bluesman 01. 08. 2006. 15:14

Po 1 najnovija iz svake kategorije
 
Mozgalica? (za nekoga mozda nije):

imam kategorije i vesti. Treba jednim querijem da izvucem po jednu najsveziju vest iz SVAKE kategorije, znaci ako imam vesti:

kat1 vest1, kat1 vest2
kat2 vest1,
kat3 vest1
kat4 vest1, kat4 vest2, kat4 vest3

Da kazemo da je poslednja najsvezija, treba da dobijem (jednim querijem)

kat1 vest2
kat2 vest1
kat3 vest1
kat4 vest3

Znaci nije frka dobiti najsvezije ali mi treba tacno po 1 najsvezija iz svake kategorije (jednim querijem).

Moja prva ideja je da probam sa: group BY cat_id ORDER BY news_date DESC
iskreno jos nisam ni probao, hocu prvo na forum ... :)

Ideje?

jablan 01. 08. 2006. 15:25

Da li su dozvoljeni subselectovi?

bluesman 01. 08. 2006. 15:28

I guess :) ali to nije onda 1 query :) salim se, shoot.

jablan 01. 08. 2006. 15:40

Kôd:

SELECT  DISTINCT kat, (SELECT vest
FROM vesti v2
WHERE v1.kat = v2.kat
ORDER  BY datum DESC
LIMIT 1
) x
FROM  `vesti` v1

Radi na MySQL 5

bluesman 01. 08. 2006. 15:50

Nemam mysql 5 i ne radi mi tako, ali radi ovako:

SELECT news_id, cat_id from news group by cat_id order by news_date DESC;

Dobijem:
Kôd:

+---------+---------+
| news_id | cat_id |
+---------+---------+
|      17 |      10 |
|      7 |      0 |
|      6 |      2 |
|      1 |      3 |
|      5 |      1 |
+---------+---------+


jablan 01. 08. 2006. 15:58

Super. Ja sam koristio logiku iz MSSQL-a, u kome inače ne možeš da staviš među rezultate (a ni među ORDER BY parametre) kolonu koju nisi stavio u GROUP BY.

Milos Vukotic 01. 08. 2006. 16:22

Trebalo bi da radi i:
SELECT MAX(news_id) AS max_id, cat_id from news group by cat_id ORDER BY max_id DESC;

ivanhoe 01. 08. 2006. 22:31

jel u mysql sa autoincrementom na id koloni garantovano da je noviji ID uvek veci od starijeg? Ili se re use-uju obrisani id-ji ? I sta se desi kad se iskoriste svi raspolozivi id-ji, jel krene opet od 1?

samo pitam, mrzi me da trazim po dokumentaciji :)

zextra 01. 08. 2006. 22:54

novi id je uvek veci za jedan od poslednjeg generisanog. to lako mozes proveriti ako uradis DELETE FROM `table` i ubacis novi zapis. resetovanje countera postizes jedino pomocu TRUNCATE TABLE `table` komande.

Uzgred, ako dostignes max broj zapisa u jednoj tabeli, verovatno neces zeleti da koristis mysql, cija stabilnost i brzina se inace dovode u pitanje kada tabela sadrzi vise od par desetina miliona zapisa...

bluesman 01. 08. 2006. 22:58

Garantovano je osim ako ne radis rucno update, sto nisam jos cuo da neko radi.

Ako imas ovako
1
2
3
4
5
6

i onda obrises 4, sledeci record koji dodajes je 7, znaci imas
1
2
3
5
6
7

E sad, ako si dovoljno lood pa napravis da umesto novog recorda dodas bas na mesto 4, sto je moguce, onda moze da se desi da je manji ID noviji od najveceg. Ali kao sto rekoh, to niko normalan ne radi, jer bi onda morao da cuvas informacije o obrisanim ili pre svakog unosa da pretrazis bazu, koji je obrisan.

To se nekada radilo sa binarnim stablima, kada se obrise record, one se obicno nije fizicki brisao nego se markirao flag da je obrisan, a u headeru tabele se cuvao offset tog recorda. Kada bi se dodavao sledeci, citala bi se informacija iz headera i file pointer pomerio na taj offset za upis. Na tom mestu je bio sacuvan offset prethodnog obrisanog recorda koji bi se onda upisao u header kao sledeci "slobodan". Znaci, svaki obrisani record je cuvao offset prethodno obrisanog. Ako nema, onda se belezi EOF kao znak da se sledeci record upisuje na kraj fajla. To je meni bila jednostavna ali interesanta filozofija. Nekada nisu postojali ogromni hard diskovi i moralo se voditi racuna o svakom bajtu prostora.

Zato je meni i danas cudno kada vidim da neko deklarise sva char polja u tabeli kao VARCHAR(255), a generalno je sve jedno. Mysql ionako ima svoju optimizaciju za manje od 10 a za ove vece, sve jedno je da li je varchar(35) ili varchar(255), razlika je u jednom bajtu. Jedino sto je malo sporije indeksiranje, ali generalno nema veze.

Ma secam se nekada da su se podaci pakovali u bitove, sada to samo zaludni rade :)

Eto, malo iskustva, kada sam ja proucavao i cak pravio neke ovakve stvari, mislim da jos uvek mogu da pronadjem kompletan BTree source koji sam pravio u C-u :)


Vreme je GMT +2. Trenutno vreme je 01:51.

Powered by vBulletin® Verzija 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Copyright © DevProTalk. All Rights Reserved.

Mišljenja, saveti, izjave, ponude ili druge informacije ili sadržaji nastali na Sajtu su vlasništvo onoga ko ih je kreirao, a ne DevProTalk.com, tako da ne morate da se oslanjate na njih.
Autori poruka su jedini odgovorni za ovakve sadržaje. DevProTalk.com ne garantuje tačnost, kompletnost ili upotrebnu vrednost informacija, stavova, saveta ili datih izjava. Ne postoje uslovi pod kojima bi mi bili odgovorni za štetu ili gubitak koji je posledica bilo čijeg oslanjanja na nepouzdane informacije, ili bilo kakve informacije nastale kroz komunikaciju između registrovanih članova.
Web sajt može sadržavati linkove na druge web sajtove na Internetu ili neke druge sadržaje. Ne kontrolišemo niti podržavamo te druge web sajtove, niti smo pregledali bilo kakve sadržaje na takvim sajtovima. Mi nećemo biti odgovorni za legalnost, tačnost ili prikladnost bilo kog sadržaja, oglasa, proizvoda, usluga ili informacije lociranim na ili distribuiranih kroz druge web sajtove, niti za bilo kakvu štetu nastalu kao posledica takvih informacija. DevProTalk.com drži i čuva druga prava vlasništva na web sajtu. Web sajt sadrže materijale zaštićene copyright-om, zaštitne znakove i druge informacije o pravu vlasništva ili softver. Članovi mogu poslatu informacije zaštićene pravima vlasništva njihovih nosilaca i ona ostaju zaštićena bez obzira da li su oni koji prenose te informacije to naveli ili ne. Osim informacija koje su u javnom vlasništvu ili za koje dobijete dozvolu, nemate pravo da kopirate, modifikujete ili na bilo koji način menjate, objavljujete, prenosite, distribuirate, izvršavate, prikazujete ili prodajte bilo koju informaciju zaštićenu pravima vlasništva. Slanjem informacija ili sadržaja na bilo koji deo DevProTalk.com, Vi automatski dozvoljavate i predstavljate garanciju da imate pravo da dozvolite DevProTalk.com ili članovima DevProTalk.com bespovratnu, kontinualnu, neograničenu, globalnu dozvolu da koriste, kopiraju, izvršavaju, prikazuju i distribuiraju takve informacije i sadržaje i da iz takvih sadžaja koriste bilo koji deo u bilo koje svrhe, kao i pravo i dozvolu da koriste gore navedene sadržaje. Svi zaštitni znakovi (trademarks), logotipi, oznake usluga, firme ili imena proizvoda koji se pominju na ovom web sajtu su vlasništvo kojim raspolažu njihovi vlasnici.