» »

[Sql] Poizvedba

[Sql] Poizvedba

tx-z ::

Sledeči stavek:

SELECT U.id_uporabnika, N.id_narocila, P.id_postavke, P.cena_izdpos, P.kolicina FROM uporabnik U, narocilo N, postavka P WHERE U.vloga_uporabnika=1 AND U.id_uporabnika = N.id_uporabnika AND N.id_narocila = P.id_narocila ORDER BY U.id_uporabnika;

Mi vrne tole:

Poizvedba



Rad bi pa mel takšno poizvedbo, da bi mi za vsakega uporabnika napistal število vseh naročil, seštevek vseh količin in seštevek vseh cen. Sicer bi lahko to potem s for zankami v Javi delu, ampak bi rad že s poizvedbo to rešu. Sql sem pa že pozabil in se ne spomnim kako se že ta grupiranja pa sum,count,... funkcije uporablja. Lahko kdo pomaga?
tx-z
  • zavaroval slike: Primoz ()

techfreak :) ::

Nekaj v smislu:
SELECT U.id_uporabnika, COUNT(N.id_narocila), SUM(P.cena_izdpos), SUM(P.kolicina) FROM uporabnik U, narocilo N, postavka P WHERE U.vloga_uporabnika=1 AND U.id_uporabnika = N.id_uporabnika AND N.id_narocila = P.id_narocila GROUP BY U.id_uporabnika ORDER BY U.id_uporabnika;

Zgodovina sprememb…

tx-z ::

Za naročila neb šlo k bi mogu dat še nekak distinct notr. Kr zdej jih vrže 7, mogl bi pa 3.

edit:
Evo, tkole sm rabu:
SELECT U.id_uporabnika AS "Uporabnik", COUNT(DISTINCT N.id_narocila) AS "Število nakupov", SUM(P.kolicina) AS "Število kupljenih izdelkov", SUM(P.cena_izdpos) AS "Skupna cena nakupov", SUM(P.cena_izdpos)/COUNT(DISTINCT N.id_narocila) AS "Povprečna cena nakupa", SUM(P.cena_izdpos)/SUM(P.kolicina) AS "Povprečna cena izdelka" FROM uporabnik U, narocilo N, postavka P WHERE U.vloga_uporabnika=1 AND U.id_uporabnika = N.id_uporabnika AND N.id_narocila = P.id_narocila GROUP BY U.id_uporabnika ORDER BY U.id_uporabnika;

Hvala! ;)
tx-z

Zgodovina sprememb…

  • spremenilo: tx-z ()

slitkx ::

Na http://zmaga.com/content.php?id=3454 sem objavil dva komentarja, na katera še nisem prejel odgovora.
Ker se mi ne zdi smiselno nadaljevati z drugimi vajami, dokler ne dobim odgovora na vprašanje, prosim za pomoč.

Pri tej vaji mi ni jasno, zakaj za:
INSERT into uporabniki VALUES(0,'Borut','Lisjak','Ljubljanska 17','Kranj')


Id naraste na 5?
Saj z vidika končnega izgleda je vseeno, ali uporabim INSERT ročno ali pa preko funkcije 'Vstavi' v tabeli?

Ko sem v prejšnji vaji na http://zmaga.com/content.php?id=2480 kreiral tabelo, sam za Janeza, Petra in Majo po vrsti nastavil Id na 1, 2 in3. Torej bi moralo biti za Boruta 4...

AutoIncrement sem vklopil za Id. Tudi po tej logiki bi četrta oseba morala dobiti 4.
In ko sem prvič pisal ukaz, je Borut tudi dobil 4. Potlej sem vnos pobrisal, ponovil enak ukaz, sedaj pa ima Borut 5???

Pa UPDATE ni deloval, ni spremenilo podatkov.

Na www.zmaga.com sem dobil odgovor.

Zgodovina sprememb…

  • spremenil: slitkx ()

tx-z ::

Če js kej prou vem, če maš autoincrement ti vedno povečuje id, ne glede na to če ti vmes brišeš..torj če daš not 1, pa potem 2 pa 3..pa zbrišeš vse, bo naslednji 4...

Kakšen pa je odgovorl potem?
tx-z

slitkx ::

tx-z je izjavil:


Kakšen pa je odgovorl potem?
Kot si napisal.

tx-z ::

Kako to preprečiš? Vem da je bla ena fora....
tx-z

galu ::

Številke se večajo ne glede na brisanje z razlogom..

Če bi se vse številke pomaknile za X mest navzdol (x = št. izbrisanih), bi to lahko povzročilo precejšnje probleme pri ostalih tabelah, ki se navezujejo na ID iz osnovne tabele (skratka, moral bi pisati precej kode, ki bi stvar lepo updejtala - brezveze).
Tako to gre.

KrEn1234 ::

tx-z je izjavil:

Kako to preprečiš? Vem da je bla ena fora....


Vprašaj sem, kaj bi v realni situaciji sploh dosegel s tem, da bi imel urejene "id" številke? Iz izkušenj vem, da popolnoma nič:)

Navadno se pri "resnejših" applikacijah uporablja pristop, da se iz baze nikoli nič ne briše. Record ima v tem primeru dodan flag, ki določa, da je zapis odstranjen. Seveda pride taka rešitev z ceno večje kompleksnosti,..

oemdzi ::

Rabim pomoč pri tem primeru (sem začetnik)



Razumem vse razen funkcije ON, kaj točno naredi ?

Zakaj ne bi recimo namesto da uporabim ON zapisal tako:

SELECT Dijak.Priimek, Dijak.Ime, Obiskuje.IDkrozek
FROM Dijak INNER JOIN Obiskuje
WHERE Dijak.IDDijak = Obiskuje.IDDijak
Torej namesto ON bi uporabil WHERE (se sploh sme ? oziroma kaj tocno naredi ON )

p.s. nevem zakaj slike vcasih delajo vcasih pa ne, ker vedno isto naredim, evo linka: http://shrani.najdi.si/?3O/k3/2xqzaLD/s...

Zgodovina sprememb…

  • zavaroval slike: Primoz ()

btree ::

če daš stran ON, potem daj namesto INNER JOIN vejico, je samo drugačen zapis inner joina:
SELECT Dijak.Priimek, Dijak.Ime, Obiskuje.IDkrozek
FROM Dijak, Obiskuje
WHERE Dijak.IDDijak = Obiskuje.IDDijak

ales85 ::

Tako kot je btree napisal. Tudi ni nič narobe, uporabiš lahko en in drug način. Ena stvar, ki bi jo lahko videl kot prednost je to, da z uporabo ON ločiš povezavo tabel od WHERE.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

PostgreSQL pomoč

Oddelek: Programiranje
162368 (1861) Mato989
»

Baze ter relation med njimi

Oddelek: Programiranje
153068 (2629) Marat
»

[Access 2007]

Oddelek: Programiranje
132543 (2143) urosz
»

[MySQL] Rabim hitrejšo SQL poizvedbo za 3 tabele!

Oddelek: Programiranje
71134 (993) shorvat
»

problem kje v strežniku ali v SQL-u ali PHP kodi?

Oddelek: Izdelava spletišč
111073 (930) Yohan del Sud

Več podobnih tem