MySQL query optimaliseren

Pagina: 1
Acties:

Vraag


  • isomis
  • Registratie: Mei 2005
  • Laatst online: 28-08 14:20
Ik heb een vraagstuk met betrekking tot het optimaliseren van een MySQL query aan de voorkant van een webwinkel. Aan de achterkant werkt alles soepeltjes.

Eerst even mijn database structuur

Afbeeldingslocatie: https://www.vidicam.nl/Untitled.png

Uitleg structuur:

In het begin was de database structuur simpel:
  • producten hebben varianten zoals verschillende kleuren of maten. Het kan ook een combinatie zijn van verschillende varianten zoals de maat M en de kleur paars.
  • producten hebben afbeeldingen
  • De varianten opties zoals kleur of maten worden in een apart tabel beheerd. De reden hierachter is om herhaling te voorkomen. Je wilt namelijk niet de Maat M bij alle 1001 producten opnieuw invoeren. Tevens heb je nu alle vrijheid om verschillende product combinaties te maken ongeacht of je nou in de kleding of food sector zit
Een query hiervoor schrijven is simpel met wat left joins naar de varianten en de afbeeldingen en je kan een compleet product weergeven.

Op een gegeven moment kwam ik met het idee dat het ook wel handig zou zijn als je wat makkelijker de desbetreffende afbeeldingen bij een product kan beheren. Dit heeft helaas bij mij als resultaat gehad dat ik naast de hoofd query om alle producten op te halen ook nog eens losse queries had per product om de juiste afbeeldingen op te halen.

De ingewikkelde uitleg:
  • Producten hebben afbeeldingen
  • Producten kunnen meerdere variaties hebben
  • Sommige afbeeldingen wil je alleen weergeven bij een bepaalde variatie of bij alle afbeeldingen
  • Via deze database structuur is dit mogelijk, want je kan zeggen: deze afbeelding alleen weergeven bij de kleur: blauw en/of Maat: M. Daarnaast kan je ook zeggen: alleen weergeven bij deze product variatie. De koppel tabellen: product_variation_image en product_image_attribute zijn hiervoor.
Aan de backend is dit allemaal makkelijk te beheren en daar zit niet echt het probleem. Aan de voorkant werkt het ophalen van een product of meerdere producten ook. Alleen dat gaat helaas niet meer via 1 query en dat moet volgens mij mogelijk zijn. Bij het ophalen van 1 product maken meerdere queries niet zoveel uit voor de prestaties, maar het ophalen van 50 producten met de juiste afbeelding geeft helaas teveel queries.

Kortom, ik wil het bundelen in 1 grote query waarbij je ook nog eens vanuit de product variaties kijkt. Er hoeft maar 1 afbeelding opgehaald te worden. Even de snelle dirty query uitgeschreven:

SELECT product_variation.*, product.title, product_image.file
FROM product_variation
LEFT JOIN product
LEFT JOIN product_image
LEFT JOIN product_attribute_combination
GROUP BY product_variation.id

Het probleem hiermee is dat je alle afbeeldingen pakt en dat willen we niet. We willen namelijk alleen de afbeeldingen met de attributen uit de product variaties. Dus aan de afbeeldingen van dat producten zitten voorwaarden gekoppeld zoals: afbeelding alleen weergeven bij de kleur blauw.

En hier loop ik compleet vast. Het enige wat ik kan bedenken is dat ik maar 1 afbeelding wil ophalen met bepaalde voorwaarden. Dus de LEFT JOIN op product_image moet een soort eigen SQL query krijgen met voorwaarden uit de tabel product_attribute_combination.

Ik heb al geprobeerd om een oplossing te vinden door te zoeken op"left joins met multiple conditions".

Kan iemand mij de goede richting op wijze?

Webontwikkelaar - Kitesurfer | Gamer

Alle reacties


Acties:
  • +1 Henk 'm!

  • watercoolertje
  • Registratie: Januari 2008
  • Laatst online: 28-08 14:32

watercoolertje

Untertitel

Je kan toch meerdere condities per (left) join doen:
LEFT JOIN tabel ON conditie1a = conditie1b AND conditie2a = conditie2b
LEFT JOIN tabel2 ON conditie3a = conditie3b AND conditie4a = conditie4b

(16 x 300Wp) 4800Wp + (sinds 14 feb 2023) (7 x 405Wp) 2835Wp = 7635Wp @Zuid op 4.5kW omvormer