Archief - MYSQL: Omslachtige query :(

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Pietje Prik

Legacy Member
Hoi mensjes

Ik ben bezig met een hardware winkel site, en dit zijn de tabellen en velden die ik gebruik:
Code:
++++++++++++++++++++
| ProductCategorie |
++++++++++++++++++++
| prod_id          |
| cat_id           |
++++++++++++++++++++

+++++++++++++++++++++++
| Product             |
+++++++++++++++++++++++
| id                  |
| naam                |
| kleine_beschrijving |
| afbeelding_klein    |
| fabrikant_id        |
+++++++++++++++++++++++

+++++++++++++++++++++++
| Fabrikant           |
+++++++++++++++++++++++
| id                  |
| naam                |
| afbeelding_klein    |
| url                 |
+++++++++++++++++++++++

++++++++++++++++++++
| WinkelPrijs      |
++++++++++++++++++++
| winkel_id        |
| prod_id          |
| prijs            |
++++++++++++++++++++
Code:
[Fabrikant]
    |
    1
    |
    |
    |
    *
    |
[Product]--1----------*--[ProductCategorie]--*-------1--[Categorie]
    |                                  
    1
    |
    |			  
    |
    *
    |
[WinkelPrijs]

Nu, mijn site is er een waar verschillende winkels hun prijs kunnen zetten voor een bepaald product (in de tabel WinkelPrijs). Ik wil de minimum, de maximum en vervolgens de gemiddelde prijs van elk product berekenen. Nu, dit maakt het moeilijk omdat er dus ook producten moeten geselecteerd zijn waarvoor nog geen prijs voor gezet is. Daarom het ik een UNION gebruikt en deze selecteert de rijen die nog niet in de eerste query verschenen.

Deze query werkt, maar hij is vrij omslachtig. Ik vroeg me af of er geen gemakkelijkere manier bestaat om deze data te bemachtigen. Of heeft deze query niet zoveel invloed op de performance van het systeem waarop mijn MySQL database staat. Deze query zal heel vaak uitgevoerd worden - nl telkens wanneer een productlijst opgevraagd wordt.

PHP:
      (
      SELECT q.id AS id, q.naam AS naam, q.kleine_beschrijving AS beschrijving, q.afbeelding_klein AS afbeelding, r.naam AS fabrikant, 
      r.url, r.afbeelding_klein, round(min(s.prijs),2) AS minprijs, round(max(s.prijs),2) as maxprijs, round(avg(s.prijs),2) as avgprijs
      FROM productcategorie pc, product q, fabrikant r, winkelprijs s
      WHERE pc.prod_id = q.id
      AND q.fabrikant_id = r.id
      AND pc.cat_id = ".$this->parent_id."
      AND s.prod_id = q.id
      GROUP BY q.id
      )
      UNION
      (
      SELECT q.id AS id, q.naam AS naam, q.kleine_beschrijving AS beschrijving, q.afbeelding_klein AS afbeelding, r.naam AS fabrikant, 
      r.url, r.afbeelding_klein, '-1' AS minprijs, '-1' as maxprijs, '-1' as avgprijs
      FROM productcategorie pc, product q, fabrikant r, winkelprijs s
      WHERE pc.prod_id NOT IN
      (
        SELECT q.id
        FROM productcategorie pc, product q, fabrikant r, winkelprijs s
        WHERE pc.prod_id = q.id
        AND q.fabrikant_id = r.id
        AND pc.cat_id = ".$this->parent_id."
        AND s.prod_id = q.id
        ORDER BY q.naam ASC
      )
      AND pc.prod_id = q.id
      AND pc.cat_id = ".$this->parent_id."
      GROUP BY q.id
)
ORDER BY naam ASC
;

Danku

Jellepunk

Legacy Member
Waarom moeten die producten zonder prijs ook geselecteerd worden om de max, min en gemiddelde prijs uit te rekenen?

Pietje Prik

Legacy Member
alle producten moeten in de lijst voorkomen. Bij wijze van info (als een winkel zijn prijs verwijdert) moeten deze toch verschijnen, maar dan met een melding dat het product geen prijs meer heeft...

[BAT] Hydra

Legacy Member
PHP:
(
SELECT q.id AS id, q.naam AS naam, q.kleine_beschrijving AS beschrijving, q.afbeelding_klein AS afbeelding, r.naam AS fabrikant, r.url, r.afbeelding_klein, round(min(s.prijs),2) AS minprijs, round(max(s.prijs),2) as maxprijs, round(avg(s.prijs),2) as avgprijs

FROM (productcategorie pc, product q, fabrikant r) LEFT JOIN winkelprijs s ON s.prod_id = q.id

WHERE pc.prod_id = q.id AND q.fabrikant_id = r.id AND pc.cat_id = ".$this->parent_id."

GROUP BY q.id
)
ORDER BY naam ASC
;
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan