Šta je novo?

MySql upit sa sortiranjem malo komplikovaniji

dj13

Čuven
Učlanjen(a)
30.01.2002
Poruke
821
Poena
665
Potreban mi je upit za mysql koji ce tablu (dobijenu posle raznih spajanja) da iscita i sortira kao tablu2, ako je uopste moguce.
A momenti su sledeci:
-sortiranje je potrebno po odredjenim vrednostima iz kolone vre.
-kao sto se vidi vrednosti iz kolone art uvek ostaju grupisane po redosledu red.
-onda bi takve grupe u celosti trebalo sortirati ASC ili DESC po odredjenoj vrednosti iz kolone vre.
-u tabli2 je za sortiranje iskoriscena vrednost iz vre (crveno, plavo, sivo, zuto) koja je u ovom slucaju u redu gde je u koloni red vrednost 1.
-duzina i broj istih vrednosti u koloni art, a samim tim i u koloni red moze da varira u velikoj meri, ali je uvek poznat maximalan broj (u ovom slucaju 4)
Ovo kao bonus ako se resi gorepomenuti query.
-vrednosti rok iz kolone art da kazem fali jedan red.
-da li se moze nekim querijem kad naidje na nepravilnost u koloni red ipak vrati vrednost. Np. u slucaju table2 da vrati nepostojeci red u kojem se sve zna osim vrednosti za kolonu vre gde ce izbaci recimo 0.

Nadam se da je barem malo jasno sta se trazi.
Za sad mi je bitno da li moze da se uradi querijem, a ne kasnijim dodatnim PHP funkcijama
poz
 

Prilozi

  • tabla.jpg
    tabla.jpg
    72.4 KB · Pregleda: 129
  • tabla2.jpg
    tabla2.jpg
    72.4 KB · Pregleda: 110
pravo da ti kazem bolje bi ti bilo da resis ovo kroz kod nego kroz query.
 
Recimo da je ovo rešenje:
Ovu tabelu (ne tablu :D ) koji imaš na slici 1 ću gledati kao table1

SELECT t2.* FROM table1 t1 inner join table1 t2 on t1.art=t2.art
where t1.red=1
order by t1.vre, t2.red

Da pojasnim sada:
- radim selekciju samo t2 jer je t1=t2=table1
- spajam praktično tabelu1 sa samom sobom
- iz t1 gledam da red ima vrednost 1, kako bi kasnije sortirao po vrednosti iz tog reda
- kad se spoje podaci dobijaš sve podatke koje si hteo sortirane prema redu (prethodno su već sortirani preko t1 koju ni ne vidiš po vre)

E sad se ti snađi kako ćeš da to dobro uklopiš u tvoju priču. Umesti table1 ti ćeš verovatno imati nešto tipa (Select * from lalala inner join tralala)

Poz
 
BRAVO NICK! Radi. Svaka cast. Odlicno znanje. Super i to :). Moja tabla :) je sad sortirana kako treba.
 
E Nick. Pojavio se mali problemcic :) vezan za nepravilnost koju sam i pomenu. Kad nema neke vrednosti u koloni red koja je u where uslovu, cela grupacija art se izgubio iz rezultata querija. Da li bi trebalo nesto dodatno smisliti za where, mada mi deluje da nije bas jednostavno? Grupacija art koja nema vrednost red ko kojoj ce se sortira moze da izadje napocetku ili kraju nebitno.
 
Poslednja izmena:
Ne pada mi na pamet kako bih to rešio.
Naime, tabela t1 koju napravim ima samo redove u kojima se za polje red nalazi vrednost 1. To je bitno da bi se izvršilo sortiranje po boji. Ako nema ništa u polju vre to nije problem, ali pošto u WHERE gledamo u polje red, neophodno je da imaš cifru 1 upisanu u svaku tvoju grupaciju.

Kakve su ti originalne tabele pa dobiješ ovu spojenu? Možda možeš da rešiš problem tako što će ti upit koji generiše tvoju tabelu ubaciti nedostajuće jedinice ili sredi tu tabelu ručno ili preko upita (selektuješ sve artikle koji nemaju red za boju, ili koji imaju, ali nemaju upisanu vrednost 1 u polje red).
Akrobacije sa SQLom su prilično moćne, ali bolje da ti je baza dobro kreirana i da imaš što jednostavnije upite.

Javi kako si rešio. Ako imaš problema sa sređivanjem baze (koje ti preporučujem) - javi.
Poz.
 
Tek razvijam bazu. Verovatno da zbog mog skromnog znanja baza nije dobro sredjena niti optimizovana. Ovu tablu generise 6 jointa i nekolicina where i order, mada mislim da ce ih biti jos, ali njih 5 su trenutno strukturno bitni, ostali dolaze samo za ispisivanje. Krenuo sam sa 2 nacela, posto ne znam kad i sta cu jos dodati. Sve rasclaniti do maximalnog, i ono sto bi inace stavljao u kolone da upisujem u redove gde god moze doci do kasnijih izmena. A sve to da bi se budici sajt lako menjao i prosirivao bez dodatnog kodiranja, i da bi sve bilo uniformisano.
Verujem da bi ti NICK mogao da izvuces i traznu tablu2 iz primarnog join-ta. Ustvari tabela1 je rezultat primarnog querija. Da sam naveo problem od pocetak sa 6 tabela i tim spajanjima tesko da bi mogao i da objasnim sta mi treba i kako. Sad pokusavam da integrisem logiku iz tvog querija u primarni pa ce vidimo. Mada u najavi necu da uspem :)
 
Poslednja izmena:
Jedino kako mogu da ti pomognem je da imam uvid u originalnu bazu.
Dobro je što se vodiš nekim principima kod kreiranja baze, učili su me to na FONu, ali je problem u realnom sistemu gde treba naći balans između normalizacije baze i performansi.

Ako želiš, baci mi na PM detalje o tome šta trenutno razvijaš ili deo baze iz koje izvlačiš ovu tabelu pa da ti dam neko svoje mišljenje o celoj stvari. Ne kažem da ću imati dobro rešenje, ali baš konkretno kod planiranja baze nije loše da se čuje još po neko mišljenje.

Poz.
 
Nisam bas siguran da ce uspeti: npr da umesto inner join-a stavis left outer join
ili napravis dva upita: 1. if (table1.red is not null)
.....
else ............
 
fix za Nickovo resenje (uz jedno spajanje vise):
Kod:
SELECT t2.* FROM tabela t1 INNER JOIN tabela t2 ON t1.art=t2.art
WHERE t1.red=(SELECT MIN(red) FROM tabela WHERE art=t1.art)
ORDER BY t1.vre, t2.red;

edit:
tek sad videh da je tema maaalo starija :)
ah, well...
 
Poslednja izmena:
Nazad
Vrh Dno