/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
Et problem jeg endnu ikke har løst
Fra : Preben


Dato : 28-07-06 12:09

Hej

Jeg har et produktkatalog hvor en bestemt varebeskrivelse fås i
forskellige størrelser og farver f.eks. i flg. tabeller:

products:
id (pk) name size

items:
id (pk) item_no product (fk) colour_code (char) (fk)

colours:
id (pk) colour_code (char) name lang


Jeg vil nu gerne have fat i alle data om det enkelte produkter - farver
og størrelser.

Størrelser har jeg gemt i et "set" og får derved f.eks.
"80,85,90,95...." som output..

Problemet dertil er dog at jeg gerne vil have alle farver i det
pågældende sprog som output.

Den ene løsning ville være at lave en SESSION-variabel (laver en PHP
side) som indeholder alle farver (altså hele tabellen colours) og derved
få output som farvekoder.

Problemet er så at disse data skal trækkes ud på en effektiv måde (dette
gøres ret ofte jo):

Løsning:
SELECT * FROM products ORDER BY name

for ethvert element
SELECT * FROM items WHERE product = $result['id']

Men findes der ikke en bedre løsning.

Output skal helst være kommasepareret så farvekoder fås som f.eks.
"001,040"?



Med venlig hilsen
Preben Holm

 
 
Jens Gyldenkærne Cla~ (28-07-2006)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 28-07-06 12:51

Preben skrev:

> products:
> id (pk) name size
>
> items:
> id (pk) item_no product (fk) colour_code (char)
> (fk)

Skal det forstås sådan at et item er en konkret instans af et
product?

Er det bevidst at du gemmer mulige størrelser i produkttabellen,
men ikke mulige farver?


> Størrelser har jeg gemt i et "set" og får derved f.eks.
> "80,85,90,95...." som output..

Sæt-værdier er generelt en dårlig ide at benytte. Det er besværligt
at trække data ud af en sæt-værdi.

Hvis størrelsen og farven er indbyrdes uafhængige, kan man lave en
struktur som følger:

products: id(pk), name

productSizes: productID (fk), size

productColors: productID (fk), color_code (fk)

items: id(pk), item_no, product(fk), size(fk), color_code(fk)

Ovenstående model angiver "gyldige" produkter vha. product,
productSizes og productColors, og items er så konkrete instanser af
produkter.

Hvis det ikke er nødvendigt at liste hvilke items der må eksistere,
kan man undvære productSizes og produktColors - og fk'erne på size
og color skal så slettes hhv. ændres.


> Løsning:
> SELECT * FROM products ORDER BY name
>
> for ethvert element
> SELECT * FROM items WHERE product = $result['id']

- kan erstattes af et join:

SELECT *
FROM products p INNER JOIN items i
ON p.id = i.product
ORDER BY name



> Output skal helst være kommasepareret så farvekoder fås som
> f.eks. "001,040"?

Det skal håndteres i php. Asp/ADO har en .GetString-metode der
samler et postsæt som en streng - jeg kan forestille mig at php har
noget lignende (men det ved de bedre i php-gruppen).
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Preben (30-07-2006)
Kommentar
Fra : Preben


Dato : 30-07-06 09:12

>> products:
>> id (pk) name size
>>
>> items:
>> id (pk) item_no product (fk) colour_code (char)
>> (fk)
>
> Skal det forstås sådan at et item er en konkret instans af et
> product?

Ja, det kan du godt sige at det er. Et "item" er det konkrete produkt
der har en bestemt farve. Det samme produkt i forskellige farver har
nemlig forskelligt varenr.

> Er det bevidst at du gemmer mulige størrelser i produkttabellen,
> men ikke mulige farver?

Ja, det er det, for varenr er ens uanset størrelsen. Dog skal man
bemærke at størrelserne kun kan forekomme i 10 forskellige størrelser -
netop derfor et "set".

>> Størrelser har jeg gemt i et "set" og får derved f.eks.
>> "80,85,90,95...." som output..
>
> Sæt-værdier er generelt en dårlig ide at benytte. Det er besværligt
> at trække data ud af en sæt-værdi.

I PHP er det ganske simpelt med en explode som giver et array som
output. Eller mener du anderledes. Jeg synes umiddelbart et sæt er det
rigtige her!


> Hvis størrelsen og farven er indbyrdes uafhængige, kan man lave en
> struktur som følger:
>
> products: id(pk), name
>
> productSizes: productID (fk), size
>
> productColors: productID (fk), color_code (fk)
>
> items: id(pk), item_no, product(fk), size(fk), color_code(fk)
>
> Ovenstående model angiver "gyldige" produkter vha. product,
> productSizes og productColors, og items er så konkrete instanser af
> produkter.
>
> Hvis det ikke er nødvendigt at liste hvilke items der må eksistere,
> kan man undvære productSizes og produktColors - og fk'erne på size
> og color skal så slettes hhv. ændres.
>
>
>> Løsning:
>> SELECT * FROM products ORDER BY name
>>
>> for ethvert element
>> SELECT * FROM items WHERE product = $result['id']
>
> - kan erstattes af et join:
>
> SELECT *
> FROM products p INNER JOIN items i
> ON p.id = i.product
> ORDER BY name

Det er så umiddelbart det jeg mener man ikke kan. Jeg ønsker at liste
produkterne som følger:

Produkt1
størrelse:
farver:
billede

Produkt2
størrelse:
farver:
billede

>> Output skal helst være kommasepareret så farvekoder fås som
>> f.eks. "001,040"?
>
> Det skal håndteres i php. Asp/ADO har en .GetString-metode der
> samler et postsæt som en streng - jeg kan forestille mig at php har
> noget lignende (men det ved de bedre i php-gruppen).

Men så er to SELECT's vel ligeså gode? Eller er der performance at hente
i et JOIN?
Tænkte bare der var noget smartere end et JOIN - evt. en kombination af
et JOIN, en GROUP BY og en SQL-funktion!


Mvh / Preben

Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409076
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste