Toon posts:

[MySQL] Subqueries samenvoegen in een UPDATE

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb in mijn DB twee tabellen: één met producten en één met winkels die gekoppeld zijn aan een product. Nu wil ik in de productentabel o.a. de minimale en maximale prijzen voor een bepaald product wegschrijven en deze prijzen moeten uit de gekoppelde tabel komen. Ik gebruik hiervoor de volgende query:

SQL:
1
2
3
4
5
6
UPDATE Products SET
price_min = (SELECT MIN(price) FROM ProductsPerShop WHERE ProductsPerShop.item_id = Products.item_id), 
price_max = (SELECT MAX(price) FROM ProductsPerShop WHERE ProductsPerShop.item_id = Products.item_id), 
price_min_total = (SELECT MIN(price_total) FROM ProductsPerShop WHERE ProductsPerShop.item_id = Products.item_id), 
price_max_total = (SELECT MAX(price_total) FROM ProductsPerShop WHERE ProductsPerShop.item_id = Products.item_id), 
shop_count = (SELECT COUNT(DISTINCT shop_id) FROM ProductsPerShop WHERE ProductsPerShop.item_id = Products.item_id)


Zoals je kunt zien gebruik ik hier vijf subqueries voor, wat zeer inefficient is: ik zou het liefst één subquery willen gebruiken die vijf resultaten teruggeeft en die resultaten dan vervolgens in de juiste velden willen schrijven. Is dit mogelijk? Ik gebruik MySQL 4, dus stored procedures zijn helaas niet mogelijk. Het mooiste zou zijn als UPDATE ook een variant had zoals INSERT, namelijk met VALUES(...,...,...), maar voorzover ik weet bestaat dat niet...

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
SQL:
1
2
3
4
5
6
7
8
9
10
UPDATE Products
SET price_min = MinPrice,
price_max = MaxPrice
[...]
FROM Products
INNER JOIN 
   ( SELEX item_id. MIN(Price) as MinPrice, Max(Price) as MaxPrice, [..]
     FROM ProductsPerShop 
     GROUP BY item_id) PpS 
ON Procucts.item_id = PpS.item_id

Oops! Google Chrome could not find www.rijks%20museum.nl


Verwijderd

Topicstarter
De code van jou werkte niet 100%, maar het idee was heel goed! Ik heb er dit van gemaakt:

SQL:
1
2
3
4
5
6
UPDATE Products, (SELECT item_id, MIN(price) as MinPrice, MAX(price) as MaxPrice 
     FROM ProductsPerShop  
     GROUP BY item_id) AS PpS
SET Products.price_min = MinPrice, 
Products.price_max = MaxPrice 
WHERE Products.item_id = PpS.item_id


Hartelijk dank! :)

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Hmm, welke foutmelding kreeg je? Volgens mij zou het moeten werken. De oplossing die je nu hebt is ook niet helemaal ideaal omdat je een zgn. correlated subquery gebruikt, de query wordt voor iedere rij in de tabel een keer uitgevoerd.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

P_de_B schreef op vrijdag 19 augustus 2005 @ 14:14:
Hmm, welke foutmelding kreeg je? Volgens mij zou het moeten werken. De oplossing die je nu hebt is ook niet helemaal ideaal omdat je een zgn. correlated subquery gebruikt, de query wordt voor iedere rij in de tabel een keer uitgevoerd.
Je kan geen FROM in een update gebruiken (in mysql iig), zoals jij had. Een join mag overigens wel, vziw.

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
ACM schreef op vrijdag 19 augustus 2005 @ 14:20:
[...]

Je kan geen FROM in een update gebruiken (in mysql iig), zoals jij had. Een join mag overigens wel, vziw.
Hmm, dan zal de syntax iets anders zijn. In MSSQL werkt dit wel.

Oops! Google Chrome could not find www.rijks%20museum.nl


Verwijderd

Ik ken MySQL niet, maar is het niet mogelijk om je berekeningen in een view te zetten ?
zoiets als :

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Create View Product_Boundaries as 
(
  Select 
    item_id,
    MIN(price) as price_min,
    MAX(Price) as price_max,
    MIN(price_total) as price_min_total,
    MAX(price_total) as price_max_total,
    Count(DISTINCT shop_id) as shop_count
FROM
  ProductsPerShop
GROUP BY
  item_id
)


Het resultaat hiervan kun je dan eventueel wel in je update statement gebruiken, of anders gewoon deze query gebruiken mocht je de gegevens nodig hebben.
Pagina: 1