Šta je novo?

SQL upit i specifično sortiranje

februarski

Slavan
Učlanjen(a)
06.07.2006
Poruke
28
Poena
304
Baza ima ovakvu strukturu: username(char), vreme(date), komentar(char). SQL treba da prikaze komentare od najnovijih ka najstarijim, ali da pokazuje samo najnoviji komentar za jednog konkretnog usera. Ako je pera ostavio komentar u 12:00, 13:00 i 14:00 da u rezultatu bude samo najnoviji unos tako da se u rezultatu useri ne ponavljaju ako su dali vise komentara. ima valda neki fazon sa max(vreme) pod SELECT ali ne znam kako da ga iskoristim. Bilo ko?
 
Probaj
SELECT * FROM imetabele
WHERE
(USERNAME,VREME) IN
(SELECT USERNAME,MAX(VREME)
FROM imetabele
GROUP BY USERNAME)
 
Poslednja izmena:
select distinct username, vreme, komentar from _tabela_ t1 group by username having vreme = (select max(vreme) from _tabela_ t2 where t2.username = t1.username);
 
Poslednja izmena:
I mene nesto slicno zanima, s tim sto mi treba dodatni uslov, a on glasi da se ispisuju samo oni unosi koji nisu stariji od recimo 30 minuta gledajuci u odnosu na vreme kada se salje zahtev za ispis.
 
Psyche je napisao(la):
I mene nesto slicno zanima, s tim sto mi treba dodatni uslov, a on glasi da se ispisuju samo oni unosi koji nisu stariji od recimo 30 minuta gledajuci u odnosu na vreme kada se salje zahtev za ispis.

TIMEDIFF(expr1,expr2)

Kod:
TIMEDIFF() returns expr1 – expr2 expressed as a time value. expr1 and expr2 are time or date-and-time expressions, but both must be of the same type.

mysql> SELECT TIMEDIFF('2000:01:01 00:00:00',
    ->                 '2000:01:01 00:00:00.000001');
        -> '-00:00:00.000001'
mysql> SELECT TIMEDIFF('1997-12-31 23:59:59.000001',
    ->                 '1997-12-30 01:01:01.000002');
        -> '46:58:57.999999'

Više o Date i Time funkcijama na
http://dev.mysql.com/doc/refman/4.1/en/date-and-time-functions.html

Poz.
 
date time funkcije su za svaku bazu razlicite... tako da je dobra ideja da se covek izjasni koja je baza u pitanju...

i funkcije tipa now() su vrlo razlicite po razlicitim sistemima...
 
Koliko se ja sećam, Psyche se iga sa MySQL i PHP, ovo je bio link za nju.

Slažem se da bi bilo lepo da znamo o kojoj je bazi reč, barem ako treba baš konkretna pomoć, a ne otprilike...
 
Ako se još nisi snašla, koristi kombinaciju TimeDiff i Time_to_sec, tj. da

Time_to_sec(timediff(time1, time2)) < 1800

Poz
 
srcky je napisao(la):
select distinct username, vreme, komentar from _tabela_ t1 group by username having vreme = (select max(vreme) from _tabela_ t2 where t2.username = t1.username);

Totalno NETAČNO! :crash:
 
deka je napisao(la):
Totalno NETAČNO! :crash:
Veoma korisna poruka...

Lepo reci:
1. Nisam siguran da ti treba distinct
2. Zašto grupišeš ako nema agregatne funkcije
3. Having ponovo nema smisla ako nemaš agregatnu funkciju, tj. u ovo m kontekstu je apsolutno pogrešno i treba koristiti WHERE
4. Ako koristiš WHERE, onda je GROUP BY posle WHERE
...

Uostalom, ne vidim da se februarski uopšte javljao.
 
Poslednja izmena:
Jeste distinct ne treba. Veca greska je u group by klauzuli (izostavljeno je vreme i komentar, odnosno treba da glasi "group by username, vreme, komentar")... i onda ce raditi.
Resenje verovatno nije najlepse, ali nije ni potpuno pogresno!?
 
"group by username, vreme, komentar"

tesko da bi nesto pametno uradilo...
 
danijel00 je napisao(la):
"group by username, vreme, komentar"

tesko da bi nesto pametno uradilo...
Kod:
mysql> select * from users;
+----------+---------------------+-------------+
| username | time                | comment     |
+----------+---------------------+-------------+
| pera     | 2005-08-15 02:00:00 | komentar #1 |
| pera     | 2006-08-15 00:00:00 | komentar #2 |
| pera     | 2006-08-16 00:00:00 | komentar #3 |
| pera     | 2006-08-17 00:00:00 | komentar #4 |
| djoka    | 2006-08-17 00:00:00 | komentar #1 |
| djoka    | 2006-08-18 00:00:00 | komentar #2 |
| djoka    | 2006-08-19 00:00:00 | komentar #3 |
+----------+---------------------+-------------+
7 rows in set (0.00 sec)
mysql> select username, time, comment from users u1 group by username, time, comment having time = (select max(time) from users u2 where u2.username = u1.username);
+----------+---------------------+-------------+
| username | time                | comment     |
+----------+---------------------+-------------+
| djoka    | 2006-08-19 00:00:00 | komentar #3 |
| pera     | 2006-08-17 00:00:00 | komentar #4 |
+----------+---------------------+-------------+
2 rows in set (0.00 sec)
 
vid stvarno, trebaju mu te dve u group by za ovu varijantu

Mada sasvim lepo radi i ovo...

select username, xcomment, xtime from test1 t1 where t1.xtime = (select max(xtime) from test1 t2 where t2.username=t1.username)
 
Poslednja izmena:
Apsolutno si u pravu Srcky. Možda samo nije potrebno grupisanje po komentarima, ali ostalo je baš ono što je februarski tražio.

Svaka čast na trudu.

Poz.
 
Nazad
Vrh Dno