Centar za edukaciju-BiH



#1 10.05.2016 15:07
Avko Van mreze
Administrator
Registrovan od:28.05.2014
Postovi:4,696


Predmet:MySQL upiti nad jednom tablom
zna li mozda netko kako ovo rijesiti.

imamo tablu prodaja voca

datum    kg    voce
1.1.2016    2    jabuka
2.1.2016    1    jabuka
3.1.2016    NULL    jabuka
4.1.2016    3    jabuka
5.1.2016    4    jabuka
1.1.2016    2    kruska
2.1.2016    3    kruska
3.1.2016    NULL    kruska
4.1.2016    3    kruska
5.1.2016    1    kruska
1.1.2016    2    mandarina
2.1.2016    3    mandarina
3.1.2016    5    mandarina
4.1.2016    NULL    mandarina
5.1.2016    4    mandarina
1.1.2016    6    naranda
2.1.2016    NULL    naranda
3.1.2016    5    naranda
4.1.2016    3    naranda
5.1.2016    1    naranda

sa SELECT upitom trebao bi izdvojiti za jabuke i koje su jos vocke imale istu prodaju za taj datum kao i jabuke, ako je prodaja 0, onda ne gledamo za druge vocke.

upit bi trebao dati ovu tablicu,

datum    kg    voce
1.1.2016    2    jabuka
1.1.2016    2    kruska
1.1.2016    2    mandarina
2.1.2016    1    jabuka
2.1.2016    1    mandarina
3.1.2016    NULL    jabuka
4.1.2016    3    jabuka
4.1.2016    3    naranda
4.1.2016    3    kruska
5.1.2016    4    jabuka
5.1.2016    4    mandarina

zivot je moja domovina.
Ovaj post je ureden 5 puta. Posljednja izmjena 10.05.2016 15:15 od strane Avko. ↑  ↓

#2 10.05.2016 16:42
dex Van mreze
Super Moderator
Registrovan od:23.02.2012
Postovi:625


Predmet:Re: MySQL upiti nad jednom tablom
PreuzmiIzvorni kôd (SQL):
  1. SELECT t1.datum, t1.kg, t1.voce
  2. FROM NazivTabele AS t1 INNER JOIN NazivTabele AS t2 ON t1.datum = t2.datum AND t1.kg = t2.kg
  3. WHERE t2.voce = 'jabuka' AND t2.kg <> NULL;
↑  ↓

#3 10.05.2016 23:42
Gjoreski Van mreze
Administrator
Registrovan od:02.02.2009
Postovi:1,828


Predmet:Re: MySQL upiti nad jednom tablom
eve probaj ova
PreuzmiIzvorni kôd (SQL):
  1. SELECT prodaja.datum, SUM(prodaja.kg) AS TotKg, prodaja.voce
  2. FROM prodaja
  3. GROUP BY prodaja.datum, prodaja.voce
  4. ORDER BY prodaja.datum
Ovaj post je ureden 1 puta. Posljednja izmjena 10.05.2016 23:46 od strane Gjoreski. ↑  ↓

#4 10.05.2016 23:45
Gjoreski Van mreze
Administrator
Registrovan od:02.02.2009
Postovi:1,828


Predmet:Re: MySQL upiti nad jednom tablom
ili ova
PreuzmiIzvorni kôd (SQL):
  1. SELECT prodaja.datum, SUM(prodaja.kg) AS TotKg, prodaja.voce
  2. FROM prodaja
  3. GROUP BY prodaja.datum, prodaja.voce
  4. HAVING (((SUM(prodaja.kg)) IS NOT NULL))
  5. ORDER BY prodaja.datum;
↑  ↓

#5 11.05.2016 10:21
Avko Van mreze
Administrator
Registrovan od:28.05.2014
Postovi:4,696


Predmet:Re: MySQL upiti nad jednom tablom
hvala na trudu

evo od dxxxl nazalost ne daje nista, mada mi se svidao kod



a od gjoreskog mi sve izlista po datumu i sta treba i sta netreba

za prvi kod:


za drugi kod:

zivot je moja domovina.
↑  ↓

#6 11.05.2016 16:48
dex Van mreze
Super Moderator
Registrovan od:23.02.2012
Postovi:625


Predmet:Re: MySQL upiti nad jednom tablom
Pisao napamet, iz glave, nisam testirao.

Ovo provereno radi

select t1.datum, t1.kg, t1.voce
from ProdajaVoca As t1
left join ProdajaVoca As t2 on t1.datum = t2.datum AND t1.kg = t2.kg
where t2.voce = 'jabuka' OR (t1.voce='jabuka' AND t1.kg is null);
Ovaj post je ureden 1 puta. Posljednja izmjena 11.05.2016 16:51 od strane dexxxl. ↑  ↓

#7 12.05.2016 09:08
Avko Van mreze
Administrator
Registrovan od:28.05.2014
Postovi:4,696


Predmet:Re: MySQL upiti nad jednom tablom
hvala dexxxl!

Citiraj dexxxl:
Pisao napamet, iz glave, nisam testirao.
Ovo provereno radi

kada si ovo napisao znao sam da to sigurno i radi. Slijepo sam vjerovao u taj kod bez imalo trunke sumnje i ako nece raditi siguran sam bio da moram preispitati svoje podatke.
Kod nije proradio od prve upravo iz razloga gore navedenih. Nakon sto sam ispravio pokusao sam i sa prvim kodom u kojem se umjesto LEFT nalazi INNER i naravno proradio je. Rade oba bez greske.
Gdje se potkrala greška?

Prvo da opiÅ¡em moj susret sa tvojim kodom i sve će isplivati na povrÅ¡inu.
Pa da krenem...
DoÅ¡ao sam kući u sitne noćne sate, kao i obićno pripit Å¡to od pića Å¡to od života.
Sjednem u kuhinju za stol pa osijetih odma neku glad te otvorim frizider i gurnem glavu unutra i vidim pivu. Rosna, hladna ćeka me. Zove me da ju uzmem. Cekalo me strpljivo u frizideru. Nije joj krivo sto sam konzumiro druge pive. Otvorim ju i znao sam da sam prvi. Podijelio bi je sa nekim i nebi mi bilo krivo. Krene mi niz grlo i osjetih da ima i unutrasnju ljepotu. Pogledam u flaÅ¡u i vidim pjeni se a nije bjesnilo. Odlicno je!
Sjednem za stol , a glad je nestala. Shvatio sam da sam bio zedan, a ne gladan.
Dok sam razmisljao sjetio sam se da pogledam na forum i vidim sta je sa prodajom voca. Na forumu gjoreski, sam samuje. Bilo mi zao sto on tamo a ja ovdje sjedimo i samujemo. Steta sto nismo blize.
Odmah sam otisao na ovu temu te odvrtio kotacic misa na zadnji post.
Uzmem tvoj kod metodom copy - paste te ga šutnem u mySQL workbench i pokrenem, kad tamo nista. Stoje kolone prazne da praznije nemogu biti, a i flaša se ispraznila te posegnem za drugom u frizider. Otvorim ju nakrenem i zatvoim oci te se bacim u razmisljanje. U glavu mi sine pomisao o TRIM i NULL.
Smijem li ovo upotrijebiti u SQL jeziku? Probat cu , nista me ne kosta.
Odem do laptopa, podrignem se pa krenem sa prepravkama.

PreuzmiIzvorni kôd (SQL):
  1. SELECT t1.datum, t1.kg, t1.voce
  2. FROM prodaja AS t1
  3.         LEFT JOIN prodaja AS t2 ON t1.datum = t2.datum
  4.         AND t1.kg = t2.kg
  5. WHERE TRIM(t2.voce) = 'jabuka' // maknuti prazna mjesta
  6. AND t2.kg <> 0 //umjesto <>NULL

ovo je proradilo, a sada da isprobam i stari kod

PreuzmiIzvorni kôd (SQL):
  1. SELECT t1.datum, t1.kg, t1.voce
  2. FROM prodaja AS t1
  3.         INNER JOIN prodaja AS t2 ON t1.datum = t2.datum
  4.         AND t1.kg = t2.kg
  5. WHERE TRIM(t2.voce) = 'jabuka' // maknuti prazna mjesta
  6. AND t2.kg <> 0 //umjesto <>NULL;

i ovo radi, znaci bilo je do NULL i TRIM. Eto radi to savrseno.

Poceo sam sa SQL jezikom i svi kazu da je jednostavan no ja sam dosao do zakljucka da je jednostavan ali zahtijeva od korisnika logiku i prirodnu inteligenciju. Mozda i ja kada vise budem koristio naucim logicki razmisljati u SQL-u. Pokusavam naci vezu izmedu VB-a i SQL sto mozda grijesim.

Mislio sam da mi SELECT upiti nad jednom tablicom ce biti dovoljni no iz tvojeg koda vidim da moram ipak otvoriti u knjigama i poglavlje: "rad sa dvije tablice" jer u tvom primjeru imamo rad sa dvije tablice koje su napravljene iz jedne.

Proucio sam naredbe INNER i LEFT, a naredba JOIN se koristi kada zelimo spojiti podatke iz dvije tablice. INNER nam vraca samo one redove koji imaju odgovarajuce vrijednosti u obje tablice, dok nam LEFT vraca sve slogove iz prve tablice u listi i odgovarajuce slogove iz tablice sa desne strane ali samo one koji imaju odgovarajuce vrijednosti u toj koloni. (OSNOVE UPRAVLJANJA RELACIONIM BAZAMA PODATAKA, R.S.Mikanovic)

sada sam probao i ja napisati nesto pa to izgleda ovako:

PreuzmiIzvorni kôd (SQL):
  1. SELECT t1.datum,t1.kg,t1.voce
  2. FROM prodaja AS t1, prodaja AS t2
  3. WHERE t1.datum=t2.datum
  4. AND t1.kg=t2.kg
  5. AND TRIM(t2.voce)='jabuka'
  6. AND t2.kg<>0

isto radi no tvoj je kod ljepsi i iz njegovog koncepta mozes vidjeti kako rijesava problem dok je kod mene nabacano AND naredbi i vjerojatno bi se u nekom vecem kodu covjek izgubio pa bi se upitao: gdje i kako?.

sada naravno imam jos jednu molbu jer ovo nije bas onako kako sam zamislio.
pod datumom 3.1.2016 jabuke su 0 i htio bi da ispise samo njih bez krusaka koje su isto 0
zivot je moja domovina.
Ovaj post je ureden 3 puta. Posljednja izmjena 12.05.2016 12:01 od strane Avko. ↑  ↓

#8 12.05.2016 11:36
Gjoreski Van mreze
Administrator
Registrovan od:02.02.2009
Postovi:1,828


Predmet:Re: MySQL upiti nad jednom tablom
Ovako
PreuzmiIzvorni kôd (SQL):
  1. SELECT t1.datum, t1.kg, t1.voce
  2. FROM prodaja AS t1 INNER JOIN prodaja AS t2 ON (t1.kg = t2.kg) AND (t1.datum = t2.datum)
  3. WHERE (((TRIM([t2].[voce]))='kruska') AND ((t2.kg)=0));
↑  ↓

#9 12.05.2016 12:13
Avko Van mreze
Administrator
Registrovan od:28.05.2014
Postovi:4,696


Predmet:Re: MySQL upiti nad jednom tablom
Citiraj Gjoreski:
Ovako
PreuzmiIzvorni kôd (SQL):
  1. SELECT t1.datum, t1.kg, t1.voce
  2. FROM prodaja AS t1 INNER JOIN prodaja AS t2 ON (t1.kg = t2.kg) AND (t1.datum = t2.datum)
  3. WHERE (((TRIM(t2.voce))='kruska') AND ((t2.kg)=0));

sada dobijem samo kruska i jabuka za 3.1.2016
ali dobro, hvala gjoreski.
u meduvremeno kombiniro sve moguce i dosao do ovoga:

PreuzmiIzvorni kôd (SQL):
  1. SELECT t1.datum, t1.kg, t1.voce
  2. FROM prodaja AS t1
  3.         LEFT JOIN prodaja AS t2
  4.         ON t1.datum=t2.datum
  5.         AND t1.kg=t2.kg
  6.         AND t1.kg<>0
  7. WHERE TRIM(t1.voce) = 'jabuka'
  8.        

sada mi lista samo jabuka pod voce, ali prikaze sve redove koje zelim, al neznam zasto ne napise ime druge i trece vocke ?
zivot je moja domovina.
Ovaj post je ureden 2 puta. Posljednja izmjena 12.05.2016 13:44 od strane Avko. ↑  ↓

#10 12.05.2016 17:43
dex Van mreze
Super Moderator
Registrovan od:23.02.2012
Postovi:625


Predmet:Re: MySQL upiti nad jednom tablom
Citat:

sada mi lista samo jabuka pod voce, ali prikaze sve redove koje zelim, al neznam zasto ne napise ime druge i trece vocke ?

Pa sam si napisao

SELECT t1.datum, t1.kg, t1.voce …
    ...
WHERE TRIM(t1.voce) = 'jabuka'

Iz leve tabele (t1) biraÅ¡ polja, iz desne (t2) postavljaÅ¡ ograničenja

Citat:

U glavu mi sine pomisao o TRIM i NULL. Smijem li ovo upotrijebiti u SQL jeziku?

Kao prvo ne razumem čemu TRIM ?

Podatke o voću trebao bi da vučeÅ¡ iz kodne tabele gde čuvaÅ¡ podatke o Å¡ifri, nazivu, bar kodu, ceni… i ostalom Å¡to ti treba. U tabelu Prodaja prebacujeÅ¡ samo ključ polje iz tabele voće. Na taj način se sprečavaju greÅ¡ke, npr jednom ukucaÅ¡ mandarina, a drugi put mandrina.

Da li je kod tebe nula (0) ili NULL?

Nula i NULL nisu isto.

Null je prazan podatak (prazno polje). Null podatak se smatra da vrednost nije poznata, pa je besmisleno uporedjivati je sa bilo čime, PA ČAK I SA SAMOM SOBOM. Ako uradis JOIN nad dve tabele po nekom polju koje sadrži i null vrednosti baza NE RADI join za te vrednosti. I kod mene u SQL-u je bila greska umesto <> null, trebalo je IS NOT NULL.
NULL vrednosti treba izbegavati kad god je to moguce. U tvom primeru postavis default vrednost na 0. Mada ne razumem ako nije bilo prodaje nekog voca tog dana otkud u tabeli?
Elem da ne dužim više, nego da dam rešenje

Ako imaš null vrednosti (prazna polja)

PreuzmiIzvorni kôd (SQL):
  1. SELECT t1.datum, t1.kg, t1.voce
  2. FROM ProdajaVoca AS t1 LEFT JOIN ProdajaVoca AS t2 ON t1.kg = t2.kg AND t1.datum = t2.datum
  3. WHERE t2.voce='jabuka' OR t1.voce='jabuka'
  4. ORDER BY t1.datum;

Ako imaš nule

PreuzmiIzvorni kôd (SQL):
  1. SELECT t1.datum, t1.kg, t1.voce
  2. FROM ProdajaVoca AS t1 INNER JOIN ProdajaVoca AS t2 ON t1.kg = t2.kg AND t1.datum = t2.datum
  3. WHERE t2.voce='jabuka' AND (t2.kg <> 0 OR t1.voce='jabuka')
  4. ORDER BY t1.datum;
↑  ↓

Stranice (4):1,2,3,4


Sva vremena su GMT +01:00. Trenutno vrijeme: 3: 46 pm.