SQL baze podataka - Sponzor: Baze-Podataka.net MySQL, MSSQL, Oracle, Access, ODBC. Ako imate problem brže i preciznije ćete dobiti odgovor ako priložite strukturu tabela ili skript koji kreira tabele i puni ih test podacima umesto što to problem opisujete samo rečima. Sponzor: Baze-Podataka.net - Blog o bazama podataka |
|
Alati teme | Način prikaza |
|
13. 04. 2009. | #1 |
član
Certified
Datum učlanjenja: 05.11.2005
Poruke: 82
Hvala: 7
1 "Hvala" u 1 poruci
|
Kako resiti ovaj upit
Imam problem sa resavanjem ovog upita. Elem, imam proizvode (razvrstane po kategorijama) i verzije tih proizvoda; i proizvodi i kategorije mogu biti ukljuceni i iskljuceni (_active je 1 ili 0); verzije su slozene po datumima (najmanji datum je najstarija verzija najveci datum je najnovija verzija). Treba da izlistam sve poslednje verzije (najveci datum) proizvoda za zadatu kategoriju.
Evo skice seme: Ovo je osnovni join koji ce odraditi spajanje tabela, ali ce mi izlistati SVE aktivne verzije za sve aktivne proizvode za kategoriju 1: Kôd:
SELECT * FROM products AS p INNER JOIN versions AS v ON p.prod_id=ver_prod_id WHERE p.prod_cat='1' AND p.prod_active='1' AND v.ver_active='1' Kôd:
GROUP BY v.ver_prod_id Kôd:
GROUP BY v.ver_date Ima li neko ideju kako da resim ovo Hvala unapred |
13. 04. 2009. | #2 |
Bojan Abramovic
Professional
Datum učlanjenja: 17.01.2008
Lokacija: Novi Sad
Poruke: 232
Hvala: 30
47 "Hvala" u 30 poruka
|
mozda...
Kôd:
SELECT MAX(ver_date) Poslednja izmena od bOkIcA : 13. 04. 2009. u 15:54. |
13. 04. 2009. | #3 |
Bojan Abramovic
Professional
Datum učlanjenja: 17.01.2008
Lokacija: Novi Sad
Poruke: 232
Hvala: 30
47 "Hvala" u 30 poruka
|
A mozes da uradis i ORDER BY ver_date DESC pa stavis LIMIT 1
|
13. 04. 2009. | #4 |
Banned
Knowledge base
Datum učlanjenja: 01.07.2005
Poruke: 1.598
Hvala: 206
140 "Hvala" u 89 poruka
|
Nisam testirao, ali vako nesto je ono sto trazis:
select * from product p, versions v, (select max(ver_id) as mid, ver_prod_id from versions group by ver_prod_id) maxresults where v.ver_id = maxresults.mid and p.prod_id=v.ver_prod_id and p.prod_active = 1 and v.ver_active = 1 edit: ovime se oslanjas na primarni kljuc tabele, jer sta ces ako budes imao istu dve verzije za isti datum ? Poslednja izmena od cvele : 13. 04. 2009. u 16:52. |
13. 04. 2009. | #5 |
novi član
Datum učlanjenja: 27.05.2008
Poruke: 7
Hvala: 0
0 "Hvala" u 0 poruka
|
Sta ce ti prefiksi za nazive kolona?
Koji su primarni kljucevi? ver_id u primeru se ponavlja, dva puta postoji 5. Koja je svrha kolone ver_id? Nije lose da se napise kod za kreiranje tabela, kako bi ti ostali lakse odgovorili, npr. Kôd:
CREATE TABLE Products ( prod_id INTEGER NOT NULL PRIMARY KEY, prod_cat INTEGER NOT NULL, prod_name VARCHAR(20) NOT NULL, prod_active INTEGER NOT NULL CHECK (prod_active IN (0,1)) ); Kôd:
SELECT v.ver_prod_id, p.prod_name, v.ver_name, MAX(v.ver_date) version_dt FROM Versions v INNER JOIN Products p ON v.ver_prod_id = p.prod_id WHERE p.prod_cat = 1 AND p.prod_active = 1 AND v.ver_active = 1 GROUP BY v.ver_prod_id, p.prod_name, v.ver_name |
13. 04. 2009. | #6 |
Banned
Knowledge base
Datum učlanjenja: 01.07.2005
Poruke: 1.598
Hvala: 206
140 "Hvala" u 89 poruka
|
gore u grupi fali:
where ver_active = 1 |
13. 04. 2009. | #7 |
član
Certified
Datum učlanjenja: 05.11.2005
Poruke: 82
Hvala: 7
1 "Hvala" u 1 poruci
|
|
14. 04. 2009. | #8 |
novi član
Datum učlanjenja: 27.05.2008
Poruke: 7
Hvala: 0
0 "Hvala" u 0 poruka
|
Pretpostavio sam, ali sam namerno postavio to pitanje, dovodeci u pitanje svrhu suvog autoincrement id-a u ovom slucaju.
U odgovoru sam grupisao SELECT po v.ver_name sto nije dobra praksa, ali sam hteo da odgovorim tako da ne menjam strukturu tabela. Koliko vidim i Cvele je isto postavio pitanje "jer sta ces ako budes imao istu dve verzije za isti datum ?". Ja bi licno uveo u tabeli Versions kombinovani primarni kljuc (prod_id, version_id) i izbegao bi autoincrement (nije nuzno, ali olaksava kod vizuelnog pregleda podataka), tako sto bi insert glasio: Kôd:
INSERT INTO Versions (version_id, prod_id, ...) VALUES ( (SELECT COALESCE(MAX(version_id), 0) + 1 FROM Versions WHERE prod_id = :zadati_prod_id), ... ) Poslednja izmena od online : 14. 04. 2009. u 00:57. |
14. 04. 2009. | #9 | |
novi član
Datum učlanjenja: 27.05.2008
Poruke: 7
Hvala: 0
0 "Hvala" u 0 poruka
|
Citat:
|
|
14. 04. 2009. | #10 |
član
Certified
Datum učlanjenja: 24.02.2009
Poruke: 55
Hvala: 0
11 "Hvala" u 7 poruka
|
Ovo bi trebalo da radi.
Kôd:
SELECT p.prod_id, p.prod_name, v.ver_name, v.ver_date FROM products p INNER JOIN versions v ON p.prod_id=v.ver_prod_id INNER JOIN ( SELECT ver_prod_id, MAX(ver_date) as ver_date FROM versions GROUP BY ver_prod_id ) t ON v.ver_prod_id=t.ver_prod_id AND v.ver_date=t.ver_date ; |
|
|
Slične teme | ||||
Tema | Početna poruka teme | Forum | Odgovori | Poslednja poruka |
Kako napraviti ovaj element u CSS ili HTML? | marijano | Web design, Layout, User Interface | 8 | 02. 04. 2010. 23:49 |
Kako resiti problem kod IE? | martinluter | (X)HTML, JavaScript, DHTML, XML, CSS | 0 | 24. 07. 2009. 00:22 |
Kako resiti CSS problem u IE7 | ppavlovic | Opušteno | 2 | 12. 05. 2007. 18:20 |
Nezgodan upit | Pedja | SQL baze podataka - Sponzor: Baze-Podataka.net | 16 | 28. 03. 2006. 18:49 |
Kako koristiti ovaj sajt? | Miloje Sekulic | Planiranje i usability | 15 | 22. 03. 2006. 11:20 |