Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Pomoć za dva ?jednostavna? upita...

[es] :: Baze podataka :: Pomoć za dva ?jednostavna? upita...

[ Pregleda: 2221 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

tranzik
Vojvodina

Član broj: 17147
Poruke: 50
93.86.33.*



Profil

icon Pomoć za dva ?jednostavna? upita...19.02.2009. u 21:18 - pre 184 meseci
Molio bih nekog iskusnijeg od mene bar za smernice...

Prvi problem:
Imam tabelu sa spiskom odabranih proizvoda (idProizvoda,kolicina...), koja se čuva kao session. Znaci, sve idProizvoda treba prvo da prosledim bazi preko samog upita. Da li postoji način da u jednom upitu dobijem podatke o svim proizvodima, a da to ne bude tipa
SELECT * FROM PROIZVODI
WHERE ID=P1 OR ID=P2 OR.......OR ID=Pn...
(valjda može malo elegantnije...)

Drugi problem:
imam tabelu Kategorije(idKategorije, NazivKategorije) i tabelu Proizvodi(idProizvoda,idKategorije,slika,...)
Može da postoji kategorija koja u tom trenutku ne sadrži nijedan proizvod.
Kako bi glasio upit koji bi vratio tri stvari:
- spisak samo onih kategorija u kojima postoje proizvodi,
- broj proizvoda u datim kategorijama i
- za svaku kategoriju sliku jednog proizvoda iz te kategorije - najbolje random, ali nije neophodno...

za prve dve stvari nije problem:
Code:

SELECT     COUNT(Proizvodi.idKategorije) AS Expr1, Kategorije.NazivKategorije
FROM         Proizvodi INNER JOIN
                      Kategorije ON Proizvodi.idKategorije = Kategorije.IDKategorije
GROUP BY Proizvodi.idKategorije, Kategorije.NazivKategorije

ali kako ovo da doteram tako da za svaku kategoriju dobijem i po jednu sliku odgovarajuceg proizvoda?

hvala unapred!



_..:_|0^0|_:.._
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+711 Profil

icon Re: Pomoć za dva ?jednostavna? upita...19.02.2009. u 22:03 - pre 184 meseci
1. Možeš malo elegantnije pomoću id IN (4, 7, 1, 6, 4)

2. Možeš da koristiš subselect tipa:
Code:
SELECT COUNT(p.idKategorije) AS Expr1, Kategorije.NazivKategorije,
(select top 1 slika from proizvodi where idkategorije = p.idkategorije) as slika
FROM Proizvodi p INNER JOIN
itd itd

(sad, negde se koristi TOP 1, negde LIMIT 1, zavisi od baze)
 
Odgovor na temu

tranzik
Vojvodina

Član broj: 17147
Poruke: 50
93.86.33.*



Profil

icon Re: Pomoć za dva ?jednostavna? upita...20.02.2009. u 12:12 - pre 184 meseci
Hvala na brzom odgovoru, RADI! :)

Za 1. sam znao da postoji nešto tog tipa, nije neko suštinsko poboljšanje, ali slažem sa da je elegantnije.
Za 2. - svaka čast! - za ono random, mislim da sad mogu da se snađem...

Moje znanje SQL-a ne dopire do podupita, tako da sam za ovo neizmerno zahvalan! :)
Pozdrav!
_..:_|0^0|_:.._
 
Odgovor na temu

tranzik
Vojvodina

Član broj: 17147
Poruke: 50
93.86.33.*



Profil

icon Re: Pomoć za dva ?jednostavna? upita...22.02.2009. u 20:10 - pre 184 meseci
Da se odmah nadovežem: probao sam prvi problem da realizujem preko ugnježdene procedure, i odmah se zakucao. :(
Proceduri sam prosledio jedan parametar, koji je u obliku stringa i sadrži spisak nekoliko IDProizvoda.
Prosleđeni string ima npr. sledeći oblik: "'prviID', 'drugiID', 'trećiID'"
Code:

ALTER PROCEDURE dbo.sp_getCartProducts
(@idProductList nvarchar)

AS
SELECT     Proizvodi.IDProizvoda, Proizvodi.Naziv, Proizvodi.Materijal, Proizvodi.Cena, Proizvodi.Opis, 
            Proizvodi.imgurl, Kategorije.NazivKategorije
FROM     Proizvodi INNER JOIN
                      Kategorije ON Proizvodi.idKategorije = Kategorije.IDKategorije
WHERE     (Proizvodi.IDProizvoda IN (@idProductList))

RETURN

Upit bi trebao da prikaže podatke o proizvodima sa ovim ID brojevima (u bazi, IDProizvoda je tipa uniqueidentifier)
Računao sam da će procedura jednostavno ubaciti vrednost ovog parametra u upit, pa krenuti sa izvršavanjem, ali dobijam grešku tipa:
"Conversion failed when converting from a character string to uniqueidentifier."

Naravno, probao sam i da stavim da je parametar tipa uniqueidentifier, ali ne radi - problem je što parametar ne sadrži samo jednu vrednost, već spisak nekoliko vrednosti,
Pitam se da li se ovo upošte može rešiti na ovaj način - preko jednog parametra (npr. nekakvom konverzijom ili štagod) ili je potreban suštinski drugačiji pristup??


_..:_|0^0|_:.._
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+711 Profil

icon Re: Pomoć za dva ?jednostavna? upita...22.02.2009. u 21:52 - pre 184 meseci
Teoretski može, ali ne kako si ti hteo (ti prosleđuješ proceduri string, a pokušavaš da ga koristiš kao niz stringova). Morao bi da

1) parsiraš taj string pa
1.1) petljom proveravaš jedan po jedan,
1.2) petljom jedan po jedan dodaš u temp tabelu pa radiš JOIN sa njom ili
2) sastaviš string koji sadrži SQL upit na koji je nalepljen taj string koji si dobio kao parametar, pa koristiš sp_executesql ili kako se već zove ta sistemska procedura (izvini, već duže ne radim sa MSSQL-om), što nije baš zgodno rešenje iz više razloga (sigurnost i brzina npr.)

Mi smo za to što ti hoćeš koristili prosleđivali listu kao XML: MSSQL ima mogućnost da prosleđeni XML posmatra kao tabelu.
 
Odgovor na temu

tranzik
Vojvodina

Član broj: 17147
Poruke: 50
93.86.33.*



Profil

icon Re: Pomoć za dva ?jednostavna? upita...23.02.2009. u 12:02 - pre 184 meseci
xexe, nisam baš iskusan, ovo sam probao onako "na mišiće", bilo bi čudo da sve radi

Inače, ovde se radi o korpi za kupovinu (asp.net). Realizovana je kao tabela koja sadrži spisak odabranih proizvoda (idProizvoda,kolicina..), koja se čuva kao session da bi i anonimni korisnici mogli da ubacuju u proizvode u korpu. Spisak proizvoda, količine i cena su uvek prikazani negde na stranici. Sada želim da kreiram detaljan prikaz korpe.
Ono što treba da dobijem je jedna tabela sa svim podacima (naziv, opis, cena, Količina) koju bih prikazao u npr DataListi.
Čini mi se da bi idealno rešenje bilo da tabelu npr. Korpa(idProizvoda, Kolicina) prosledim u obliku xml-a, jer jedino tako bih na kraju imao sve podatke, zajedno sa količinom u jednoj tabeli.

Da li bi mogao da mi daš prmer kako da:
1) formatiram podatke iz tabele u xml (i mora li baš da se kreira temp.xml ili može u letu?),
2) prosledim proceduri,
3) iskoristim takav parametar u proceduri?

Znam da nije malo, ali baš bi mi značilo.
pozz
____
u međuvremenu, uspeo sam da ga nateram da radi (štap+kanap):
kreirao sam kompletan upit u obliku dugačkog stringa i pomoću Repeater-a napunio jednu tabelu podacima iz baze. onda sam ovoj tabeli dodao još jednu kolonu "kolicina" i pomoću petlje, poređenjem idProizvoda, uneo odgovarajuće količine iz prve tabele (koja se čuva kao session)...
radi posao, mada to nije to. Ako nije problem, molio bih te malo objašnjenje za rešenje preko xml-a.

[Ovu poruku je menjao tranzik dana 23.02.2009. u 15:47 GMT+1]
_..:_|0^0|_:.._
 
Odgovor na temu

Zidar
Canada

Član broj: 15387
Poruke: 3085
*.100.46-69.q9.net.



+79 Profil

icon Re: Pomoć za dva ?jednostavna? upita...23.02.2009. u 19:33 - pre 184 meseci
U MS SQL 2000 i 2005 moguce je kreirati korisnicku funkciju koja vraca tabelu. Ono sto tebi treba je ovo:

Code:

CREATE FUNCTION [dbo].[udfDelimitedPairedListToTable_2]
(
    @delimitedString    varchar(max),
    @delimiter            char(1) = ';',
    @ValueDelimiter        char(1) = ','
)
RETURNS 
@ReturnTable TABLE 
(
    -- Add the column definitions for the TABLE variable here
    FieldName    varchar(255),
    FieldValue    varchar(255)
)
AS
BEGIN
    -- Fill the table variable with the rows for your result set
    IF @delimitedString is not null And Patindex ('%_' + @ValueDelimiter + '_%;', @delimitedString) <> 0 
      Begin
        WITH ParseString
                -- PairedValue will return a string like '??,??;' if "," is paired delimiter and ";" is delimiter
             AS (SELECT PairedValue = LTRIM(SUBSTRING(@Delimiter + @delimitedString + @Delimiter, TheNumber + 1,
                                   CHARINDEX(@Delimiter, @Delimiter + @delimitedString + @Delimiter,
                                             TheNumber + 1) - TheNumber))
                 FROM   dbo.Numbers
                 WHERE  TheNumber >= 1
                        AND TheNumber < LEN(@Delimiter + @delimitedString + @Delimiter) - 1
                        AND SUBSTRING(@Delimiter + @delimitedString + @Delimiter, TheNumber, 1) = @Delimiter)

        Insert Into @ReturnTable
--        SELECT 
--            LEFT(PairedValue, CHARINDEX(',', PairedValue) - 1), 
--            Rtrim(RIGHT(Left(PairedValue, LEN(PairedValue) -1), LEN(PairedValue) - CHARINDEX(',', PairedValue) - 1))

        SELECT 
            LEFT(PairedValue, CHARINDEX(@ValueDelimiter, PairedValue) - 1)
            , Rtrim(RIGHT(Left(PairedValue, LEN(PairedValue) -1)
            , LEN(PairedValue) - CHARINDEX(@ValueDelimiter, PairedValue) - 1))
        FROM
            ParseString
      End                    

    RETURN 
END




Primer:
Code:

DECLARE @myString varchar(MAX)
DECLARE @myDelimiter varchar(1 )
DECLARE @myValueDelimiter varchar(1)

SELECT    @myDelimiter = ';'
        , @myValueDelimiter = '='
        , @myString = 'Jabuke=20;Kruske=15;Sljive=10;'

SELECT 

FROM  [dbo].[udfDelimitedPairedListToTable_2](@myString, @myDelimiter, @myValueDelimiter)

-- rezultat:
Jabuke    20
Kruske    15
Sljive    10
-- Rezultat mozes da INSERT INTO u tvoju tabelu


Tvoj programski kod bi trebao da napravi ](@myString, @myDelimiter, @myValueDelimiter) i da to posalje funkciji.

 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+711 Profil

icon Re: Pomoć za dva ?jednostavna? upita...23.02.2009. u 19:52 - pre 184 meseci
Zidarevo rešenje je jedno od mogućih, prilično robusno i lako za korišćenje.

Nažalost, ja nemam ni uslova ni vremena da ti napišem ceo kod za XML, samo mogu da te uputim na par tekstova:

Članak o različitim načinima rešavanja tvog problema:
http://www.primaryobjects.com/CMS/Article79.aspx

Primer korišćenja XML-a kao tabele:
http://msdn.microsoft.com/en-us/library/ms186918.aspx

Na kraju krajeva, možda nije loše da napraviš perzistentnu korpu, tj. da se ne oslanjaš na sesiju, nego da beležiš u bazu sve... Ima i to svojih prednosti.
 
Odgovor na temu

Zidar
Canada

Član broj: 15387
Poruke: 3085
*.100.46-69.q9.net.



+79 Profil

icon Re: Pomoć za dva ?jednostavna? upita...24.02.2009. u 14:41 - pre 184 meseci
ZIdar tek sad primetio da se koristi i tabela dbo.Numbers. Ona izgleda ovako: CREATE TABLE Numbers (TheNumber int NOT NULL PRIMARY KEY CLUSTERED) i kolona TheNumber sadrzi brojeve od 0 do N, gde je N neki veliki broj . Tabelu morate da kreirate i napunite sami i da vodite racuna da su SVI brojevi od 0 do N tamo. Ne sme da bude praznina.


 
Odgovor na temu

[es] :: Baze podataka :: Pomoć za dva ?jednostavna? upita...

[ Pregleda: 2221 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.