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 |
|
09. 02. 2008. | #1 |
profesionalac
Qualified
Datum učlanjenja: 19.05.2007
Poruke: 123
Hvala: 13
3 "Hvala" u 3 poruka
|
[MySQL] - Odredjivanje pozicije vijesti sa jedniom SQL upitom
Kôd:
-- -- Table structure for table `pozicije` -- CREATE TABLE `pozicije` ( `id` int(11) NOT NULL auto_increment, `pozicija` enum('1','2','3','4') NOT NULL, `vijest_id` int(11) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `pozicija` (`pozicija`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=4; -- -- Dumping data for table `pozicije` -- INSERT INTO `pozicije` VALUES (1, '1', 2); INSERT INTO `pozicije` VALUES (2, '2', 1); INSERT INTO `pozicije` VALUES (3, '3', 67); -- -- Table structure for table `vijesti` -- CREATE TABLE `vijesti` ( `id` int(11) NOT NULL auto_increment, `naslov` varchar(100) NOT NULL, `tekst` text, `datum` datetime NOT NULL, `datum_objave` datetime default '0000-00-00 00:00:00', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=68; Vijesti na poziciji 2, 3, i 4 imaju isti prikaz (layout), dok vijest na Poziciji 1 ima nešto drugačiji! Znaci, treba jedan upit da izvuće vijest na Poziciju 1, i drugi za izvuče vijesti na Pozicije 2, 3, i 4. Potrebno je da omogućim bolje pozicioniranje, tj. forsiranje nekih vijesti u odnosu na druge vijesti. Dakle, u admin panelu bi trebao da administrator da pozicijama dodijeli vijesti. Svim pozicijama ne mora biti dodijeljenja vijest! Moja ideja je da se to rijesi prkeo gore navedenih tabela! Recimo sa sljedećim jendostavnim upitom dobijem vijesti soritrane po pozicijama 2, 3, i 4. Kôd:
SELECT v.naslov, p.pozicija FROM vijesti v, pozicije p WHERE v.id = p.vijest_id AND p.pozicija IN (2,3,4) ORDER BY p.pozicija Ukoliko nekoj od pozicija nije dodijeljena vijest (recimo pozicijima 1 i 3), gornji upit će naravno vratiti jedan red. tj. jednu vijest. Da li je moguće i kako da se jednim upitom vratim vijest na Poziciji 2 i jos dvije zadnje unešene vijesti? Da li to mogu uraditi na osnovu ove strukture tabela ili je jedino rješenje da ovaj problem riješim na nivou programskog jezika! Lp i hvala, mb Poslednja izmena od mb_sa : 09. 02. 2008. u 13:30. Razlog: naslov - Odredjivanje pozicije vijesti sa jedniom SQL upitom |
09. 02. 2008. | #2 |
VD IT Direktora
Invented the damn thing
Datum učlanjenja: 08.06.2005
Lokacija: Beograd
Poruke: 2.118
Hvala: 503
1.307 "Hvala" u 282 poruka
|
(pišem iz glave)
Kôd:
select *, ifnull(p.pozicija, 1000) as pp from vesti v left outer join pozicije p on v.id = p.vest_id order by pp asc, datum_objave desc limit 3
__________________
blog |
09. 02. 2008. | #3 |
novi član
Na probnom radu
Datum učlanjenja: 12.02.2007
Lokacija: Novi Sad
Poruke: 25
Hvala: 0
4 "Hvala" u 3 poruka
|
Mozda jednostavnije:
Stavi u tabelu vesti polje "prioritet", i izbaci veznu tabelu. U "poziciju" upisujes 1 za poziciju 1 i sl... Query je: SELECT * FROM vesti ORDER BY pozicija, datum_objave DESC LIMIT 4 |
10. 02. 2008. | #4 |
old school
Professional
|
Iskreno nisam siguran da li sam shvatio kakav rezultat ti treba, a mislim i da ti struktura tabela nije najbolje povezana... Koliko sam shvatio, ti u tabeli 'pozicije' mozes trenutno imati najvise 4 unosa?
Evo ti SQL upit s kojim se mozes igrati, kako bi dobio zeljeno rjesenje: Kôd:
(select v.id, v.naslov, v.tekst, v.datum, v.datum_objave, p.pozicija as pid from vijesti v, pozicije p where v.id = p.vijest_id -- and p.pozicija in (2,3,4) ) union (select v.id, v.naslov, v.tekst, v.datum, v.datum_objave, 5 as pid from vijesti v order by v.datum_objave desc limit 2) order by 6 asc, 5 desc limit 4;
__________________
Blog: Baze podataka ------------------------ Oracle OCP DBA Oracle OCE SQL Expert Oracle OCP Developer Certified MySQL DBA |
10. 02. 2008. | #5 |
Ivan Dilber
Sir Write-a-Lot
|
ja imam vrlo slican sistem ugradjen u CMS i resio sam ga jednostavno bas kao sto i Mrlja predlaze... imas polje positition za svaku vest i onda samo omogucis adminu da sortira vesti (upise se position svakoj vesti, onima kojima nije upisan position upises 0 default vrednost), a ti ih posle vadis prostim sortiranjem po position polju i po datumu..
__________________
Leadership is the art of getting people to want to do what you know must be done. |
10. 02. 2008. | #6 |
profesionalac
Qualified
Datum učlanjenja: 19.05.2007
Poruke: 123
Hvala: 13
3 "Hvala" u 3 poruka
|
Ljudi, hvala na odgovrima!
Prvobitno sam se i ja sjetio rješenja koje predlaže Mrlja, ali sam ga odbacio, da bi sada ustvari shvatio da je to najpametnije. Pošto će za kratak rok recimo biti 15.000 vijesti, a svakodnevno će se unositi po 50-60 vijesti, bilo mi je glupo da se 50-60 puta na dan radi update tabele od 15.000+ redova (da se postavi pririetet na 0), jer sam mislio (tačnije nisam uopće mislio ) da će trebati to uraditi. Nisam uopće razmišljo kako da zaobidjem taj problem, nego sam krenuo preko gore navedenog rješenja. Ovako sada default vrijednost 'priorteta' postavim na 0, u admin panelu za jednu ili 4 sve vijesti odredim pozicije. Sutra, kada admin bude htio da promijeni vijest na poziciji 3, uradiće se samo update 2 vijesti, tj. onu vijest koja ima poziciju(prioritet) 3 - postavimo ga na 0 i vijest koju želimo da pridružimo poziciji 3 - postavimo prioritet na 3. Dakle, ukupno 2 UPDATE uputa. Jeli tako? . Hvala svima na odgovorima, bilo je od pomoći! @Dejan Topalovic: Da, tabela pozicije je mogla imati maximlano 4 unosa, jer su 4 pozicije bile predviđene. Oko ovog se 'cimam' prevenstveno zato što sam želio da uštedim jedan query viška, jer će se ove pozicije vrtiti na indexu stranice, biće fino posjećeno, pa prvenstveno zbog brzine i performansi. Poslednja izmena od mb_sa : 10. 02. 2008. u 09:37. |
|
|