Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


sql fråga produkt och variant med min

Postades av 2009-04-24 00:06:16 - Stefan Johansson, i forum databaser, Tråden har 11 Kommentarer och lästs av 1670 personer

Hej!

Jag har en enkel fråga tror jag!

Jag har en tabell product som ser ut enligt:

product
--------
productidid
name
description
...


I systemet finns också en tabell variant enligt:

variant
--------
variantid
productid
price
pricerecommended
....

Det kan alltså finnas flera varianter på en produkt...

Jag vill retunera en lista med produkter med dessa fält

productid
name
description
price
pricerecommended

...där price och pricerecommended kommer från den post i varianttabellen knuten till den specifika artikeln med lägst price!

/hur gör man detta smidigt i en sql sats?

/tack!
Stefan


Svara

Sv: sql fråga produkt och variant med min

Postades av 2009-04-24 08:41:52 - Thomas Vanhaniemi

Du skriver inte vilken databas, men om du vill ha det lägsta priset och lägsta rekommenderade priset kan du köra något i stil med detta. Notera att jag skrivit lite MySQL specifik syntax, så har du en annan databas får du säkert lägga till "AS xxx" för price, pricerecommended, p och v.
<code>
SELECT p.productid, p.name, p.description, MIN(v.price) price, MIN(v.pricerecommended) pricerecommended FROM product p
JOIN variant v USING (productid)
GROUP BY p.productid
</code>
Vill du däremot koppla den raden från variant tabellen till product tabellen där price är lägst för en produkt och ta både priset och det rekommenderade priset från samma rad fungerar inte ovanstående för det.


Svara

Sv: sql fråga produkt och variant med min

Postades av 2009-04-24 10:09:19 - Lars Berg

<code>
select p.productid,
p.name,
p.description,
v.price,
v.pricerecommended
from product p
join variant v on p.productid = v.productid
where price in
(select min(price)
from variant
where variant.productid = p.productid)
</code>


Svara

Sv:sql fråga produkt och variant med min

Postades av 2009-04-24 11:19:30 - Stefan Johansson

hej lars!

tack tack denna funkar enligt min beskrivning men jag kom ju självklart på en grej till!

en produkt kan t.ex. ha varianter med:

price pricerecommended
495 1295
495 1195
495 1495

och din sql kommer då returnera alla dessa rader...

jag vill låsa den till kombinationen av price och pricerecommended som ihop är minsta dvs i detta fallet den mellersta raden med price 495 och pricerecommended 1195.

ett annat fall kan vara:
price pricerecommended
395 1495
495 1195
495 1295

och då vill jag retunera första raden med price 395 och pricerecommended 1495, price är alltså "styrande" även om pricerecommended i detta fall inte är det lägsta...

/tack igen!
/stefan


Svara

Sv:sql fråga produkt och variant med min

Postades av 2009-04-24 11:21:25 - Stefan Johansson

hej thomas!

tack för ditt svar. jag jobbar mot mysql.

precis som du skriver sist vill jag ta det från samma rad och då funkar inte riktigt detta. kolla mitt svar till lars så fattar du nog!

tack för hjälpen!
/mvh stefan


Svara

Sv: sql fråga produkt och variant med min

Postades av 2009-04-24 13:45:48 - Lars Berg

<code>
select p.productid,
p.name,
p.description,
v.price,
min(v.pricerecommended) as pricerecommended
from product p
join variant v on p.productid = v.productid
where price in
(select min(price)
from variant
where variant.productid = p.productid)
group by p.productid,
p.name,
p.description,
v.price
</code>


Svara

Sv:sql fråga produkt och variant med min

Postades av 2009-04-24 16:18:31 - Stefan Johansson

tjena lars!

detta verkar ju funka finfint!

kan du förklara lite hur det funkar?

behövs verkligen min(v.pricerecommended) as pricerecommended först i select?

behövs verkligen p.name, p.description och v.price i group by?

/tacktack
Stefan


Svara

Sv: sql fråga produkt och variant med min

Postades av 2009-04-24 17:39:47 - Thomas Vanhaniemi

1. product och variant tabellerna sammanfogas med productid.
2. WHERE delen säger att enbart ta de rader som har det lägsta priset för den produkten.
3. MIN i SELECT delen säger att minsta möjliga värde för pricerecommended ska returneras. Alla rader för en produkt kommer att ha sama price.
4. GROUP BY grupperar produkterna till enstaka rader, MIN fungerar inte annars.
5. Och nej, du behöver inte mer än p.productid i GROUP BY då denna är unik i sig.

Tänk dock på att denna SQL sats kör en subquery för varje rad, vilket med många rader kan bli väldigt prestandakrävande (uppgå till tusentals interna frågor i databasen).


Svara

Sv: sql fråga produkt och variant med min

Postades av 2009-04-24 18:12:10 - Thomas Vanhaniemi

Testade göra det samma med en extra JOIN, borde vara bättre prestanda på större datamängder.
<code>
SELECT p.productid, p.name, p.description, v.price, MIN(v2.pricerecommended) pricerecommended FROM product p
JOIN
(
SELECT productid, MIN(price) price FROM variant
GROUP BY productid
) v ON v.productid = p.productid
JOIN variant v2 ON v2.productid = p.productid AND v2.price = v.price
GROUP BY p.productid
</code>


Svara

Sv:sql fråga produkt och variant med min

Postades av 2009-04-26 20:19:40 - Stefan Johansson

utmärkt förklaring :)

jag kör mot mysql 5 och din andra variant vill inte fungera...

jag antar att det är delen:

JOIN
(
SELECT productid, MIN(price) price FROM variant
GROUP BY productid
) v ON v.productid = p.productid

som ställer till det? eller missar jag nåt?

vad gäller prestandan tror jag inte det kommer bli nåt problem... dels har vi i nuläget endast ca 50 produkter med 200 varianter. Dessutom är produkterna uppdelade i kategorier så denna sql sats joinas med en länktabell som endast plockar ut de produkter i den kategori som listas...

/stefan


Svara

Sv: sql fråga produkt och variant med min

Postades av 2009-04-26 22:20:43 - Thomas Vanhaniemi

Svårt att säga utan att få veta felmeddelandet MySQL ger, men troligtvis kan det vara så att även subqueryn måste ha ett alias för att MySQL ska kunna tyda frågan.
Testa med nedanstående.
<code>
SELECT p.productid, p.name, p.description, v.price, MIN(v2.pricerecommended) pricerecommended FROM product p
JOIN
(
SELECT var.productid, MIN(var.price) price FROM variant var
GROUP BY var.productid
) v ON v.productid = p.productid
JOIN variant v2 ON v2.productid = p.productid AND v2.price = v.price
GROUP BY p.productid
</code>
Det är bra att programmera så optimerat man kan, även om inte det för tillfället kräver det (om det inte förstås tar mycket längre tid).


Svara

Sv:sql fråga produkt och variant med min

Postades av 2009-04-29 11:44:57 - Stefan Johansson

Hej Thomas,

Felmeddelandet från mysql var: unknown column 'v.Price' in 'field list'

Det var jag som strulat till det, i subqueryn hade jag missat att lägga till aliaset price för Min(var.price)

Tack tack!

Optimera är alltid bra. Mycket sant.

/s


Svara

Nyligen

  • 18:42 Hvor finder man håndlavede lamper
  • 18:41 Hvor finder man håndlavede lamper
  • 16:36 Allt du behöver veta om keramiskt
  • 16:14 Vem anlitar man egentligen när tak
  • 16:14 Vem anlitar man egentligen när tak
  • 16:13 Vem anlitar man egentligen när tak
  • 11:52 Noen erfaring med uttak hos Mostbe
  • 11:51 Noen erfaring med uttak hos Mostbe

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 570 570
27 958
271 741
5 842
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies