75 JOINS uitvoeren

Pagina: 1
Acties:
  • 746 views

Onderwerpen


  • Ruffian
  • Registratie: Augustus 2001
  • Laatst online: 10-09 14:50
We zijn druk bezig met een filter systeem voor onze CMS/Webshop.
Nu slaan we bij een product diverse kenmerken op, alle kenmerken komen in dezelfde kenmerken tabel.
Nu hebben we 5 soorten kenmerken met verschillende waardes (denkend aan maat/kleur/doelgroep).

Ons idee was om met een JOIN alle kenmerken af te lopen maar zoals het er nu naar uit ziet krijgen we dan 75 JOINS.
En als er nieuwe kenmerken bij komen loopt dit nog verder op. Wat niet erg soepel loopt op de server.

Maar hoe kunnen we dit het beste opzetten?

A life? Where can I download it??


Verwijderd

Misschien snap ik het probleem verkeerd maar dit kan je toch gewoon doen met een enkele left join?

http://www.w3schools.com/sql/sql_join_left.asp

[ Voor 23% gewijzigd door Verwijderd op 15-09-2011 13:20 ]


  • Redshark
  • Registratie: Mei 2002
  • Laatst online: 21:24
Je hebt het over twee tabellen als ik het zo begrijp (producten en kenmerken). Daartussen kun je dan 1 join maken en dat zou voldoende moeten zijn lijkt mij? 75 joins lijkt mij overdreven, bedoel je niet gewoon dat er op dit moment 75 combinaties van producten en kenmerken te maken zijn?

Hoe ziet je datamodel eruit?

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
Ik voeg me bij de mening van Redshark. Afhankelijk van je datamodel kan je dit afhandelen met 1 tot 5 joins. Ik begrijp niet waar je dat getal van 75 vandaan tovert.

Je TS is nogal beknopt, misschien kan je uitleggen 1) hoe je datamodel er uitziet en 2) hoe jij denkt dat de query eruit gaat zien

  • itsalwaysme
  • Registratie: Juni 2004
  • Laatst online: 12-09 15:05

itsalwaysme

Graast voor DB

Als je echt 75 joins nodig hebt, dan is de eerste stap: redesign database, of ieder geval bekijken of je database niet beter simpler kan.

Graast voor Division Brabant
It's hardware that makes a machine. It's software that makes it work (most of the time).


  • Ruffian
  • Registratie: Augustus 2001
  • Laatst online: 10-09 14:50
PHP:
1
SELECT cms_producten.id, cms_producten.titel, cms_producten.merk, cms_producten.prijs FROM cms_product_kenmerk AS `1` LEFT JOIN cms_producten ON `1`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `2` ON `2`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `3` ON `3`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `4` ON `4`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `5` ON `5`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `6` ON `6`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `7` ON `7`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `8` ON `8`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `9` ON `9`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `10` ON `10`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `11` ON `11`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `12` ON `12`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `13` ON `13`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `14` ON `14`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `15` ON `15`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `16` ON `16`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `17` ON `17`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `18` ON `18`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `19` ON `19`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `20` ON `20`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `21` ON `21`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `22` ON `22`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `23` ON `23`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `24` ON `24`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `25` ON `25`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `26` ON `26`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `27` ON `27`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `28` ON `28`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `29` ON `29`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `30` ON `30`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `31` ON `31`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `32` ON `32`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `33` ON `33`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `34` ON `34`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `35` ON `35`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `36` ON `36`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `37` ON `37`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `38` ON `38`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `39` ON `39`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `40` ON `40`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `41` ON `41`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `42` ON `42`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `43` ON `43`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `44` ON `44`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `45` ON `45`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `46` ON `46`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `47` ON `47`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `48` ON `48`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `49` ON `49`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `50` ON `50`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `51` ON `51`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `52` ON `52`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `53` ON `53`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `54` ON `54`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `55` ON `55`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `56` ON `56`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `57` ON `57`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `58` ON `58`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `59` ON `59`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `60` ON `60`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `61` ON `61`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `62` ON `62`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `63` ON `63`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `64` ON `64`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `65` ON `65`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `66` ON `66`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `67` ON `67`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `68` ON `68`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `69` ON `69`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `70` ON `70`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `71` ON `71`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `72` ON `72`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `73` ON `73`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `74` ON `74`.product = cms_producten.id LEFT JOIN cms_product_kenmerk AS `75` ON `75`.product = cms_producten.id WHERE (`1`.waarde = '43x22x8cm' OR `2`.waarde = '71 x 10.5 x (74-85) cm' OR `3`.waarde = '81 x 10.5 x (76-86) cm' OR `4`.waarde = '85x22,5x13cm' OR `5`.waarde = '90 x 10.5 x (80-102) cm' )AND( `6`.waarde = 'Vast' OR `7`.waarde = 'Verstelbaar' )AND( `8`.waarde = '116' OR `9`.waarde = '128' OR `10`.waarde = '140' OR `11`.waarde = '152' OR `12`.waarde = '164' OR `13`.waarde = '176' OR `14`.waarde = '24 t/m 34' OR `15`.waarde = '26' OR `16`.waarde = '27' OR `17`.waarde = '27-30' OR `18`.waarde = '28' OR `19`.waarde = '28-31' OR `20`.waarde = '29,5' OR `21`.waarde = '29-32' OR `22`.waarde = '30-33' OR `23`.waarde = '31' OR `24`.waarde = '32' OR `25`.waarde = '32-35' OR `26`.waarde = '33,5' OR `27`.waarde = '33-36' OR `28`.waarde = '34' OR `29`.waarde = '34-37' OR `30`.waarde = '35' OR `31`.waarde = '35-38' OR `32`.waarde = '36' OR `33`.waarde = '36-39' OR `34`.waarde = '37' OR `35`.waarde = '37,5' OR `36`.waarde = '37-40' OR `37`.waarde = '38' OR `38`.waarde = '38,5' OR `39`.waarde = '38-41' OR `40`.waarde = '39' OR `41`.waarde = '40' OR `42`.waarde = '40,5' OR `43`.waarde = '41' OR `44`.waarde = '42' OR `45`.waarde = '42,5' OR `46`.waarde = '43' OR `47`.waarde = '43,5' OR `48`.waarde = '44' OR `49`.waarde = '44,5' OR `50`.waarde = '45' OR `51`.waarde = '45,5' OR `52`.waarde = '46' OR `53`.waarde = '47' OR `54`.waarde = '47,5' OR `55`.waarde = '48' OR `56`.waarde = 'Jr' OR `57`.waarde = 'L ' OR `58`.waarde = 'L (58-60cm)' OR `59`.waarde = 'M ' OR `60`.waarde = 'M (54-58cm)' OR `61`.waarde = 'S ' OR `62`.waarde = 'S (50-54cm)' OR `63`.waarde = 'Sr' OR `64`.waarde = 'XL' OR `65`.waarde = 'XL (60-62cm)' OR `66`.waarde = 'XXL' )AND( `67`.waarde = 'Canvas' OR `68`.waarde = 'Flexlite' OR `69`.waarde = 'Hardboot' OR `70`.waarde = 'Semi-softboot' OR `71`.waarde = 'Softboot' OR `72`.waarde = 'Supreme' OR `73`.waarde = 'Vapor' )AND( `74`.waarde = 'Junior' OR `75`.waarde = 'Senior')


Dit is mijn query.

A life? Where can I download it??


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

En je datamodel?

Als je volgens je datamodel 75 joins nodig hebt dan kun je beter 1) je datamodel weggooien of 2) filtering regelen in je programmacode.

Wat ik aan je query kan zien is dat je alle mogelijke kenmerken in één tabel hebt gepropt en er vervolgens betekenis aan geven. Mooi voorbeeld van een database in een database.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Ik denk dat je best gewoon eens kijkt naar een goede cursus normalisatie. Ik kan me niet inbeelden dat voor zo'n kleine database al 75 joins nodig zouden zijn. Zou je hier je datamodel nog even kunnen tonen, zodat wij er ons een beter beeld van kunnen vormen?

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
Ga dat is even formatten tot een leesbaar geheel....

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Verwijderd schreef op donderdag 15 september 2011 @ 13:22:
Ik denk dat je best gewoon eens kijkt naar een goede cursus normalisatie. Ik kan me niet inbeelden dat voor zo'n kleine database al 75 joins nodig zouden zijn.
Bij meerdere keren joinen op één en dezelfde tabel kan dat natuurlijk best als je juist te ver door normaliseert. ;) Maar goed, dan is diezelfde cursus normalisatie ook handig, mits die doorgaat na de derde normaalvorm.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
NMe schreef op donderdag 15 september 2011 @ 13:25:
[...]

Bij meerdere keren joinen op één en dezelfde tabel kan dat natuurlijk best als je juist te ver door normaliseert. ;) Maar goed, dan is diezelfde cursus normalisatie ook handig, mits die doorgaat na de derde normaalvorm.
Wat ik uit die onleesbare brij op maak is dat het ook met één JOIN kan (maar dan nog wel heel veel conditions in de WHERE)

  • Ruffian
  • Registratie: Augustus 2001
  • Laatst online: 10-09 14:50
Afbeeldingslocatie: http://i55.tinypic.com/2cs8kjn.jpg

A life? Where can I download it??


Verwijderd

SELECT *
FROM cms_product_kenmerk AS kenmerk
LEFT JOIN cms_producten AS product
ON kenmerk.Id=product.Id
ORDER BY kenmerk.id

Dit gewoon even aanpassen naar jou situatie.

  • Redshark
  • Registratie: Mei 2002
  • Laatst online: 21:24
Handig, al die waarden in je where-clasule. Je weet dat je dit handel vol onderhoudsuren op gaat leveren wanneer je iets wijzigt aan die voorwaarden he.

Waarom wil je die voorwaarden trouwens zo strikt vastleggen? Als het goed in de DB zit kun je gewoon filteren op 1 product en krijg je alleen die voorwaarden die bij dat product horen.

Voorbeeld van Soluna werkt prima volgens lijkt mij.

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ja doei; zo werkt het hier niet. De reacties die je geeft gaan helemaal nergens op in en je dumpt gewoon je (ongeformatteerde & onleesbare) query en nu een screenshot. We zijn gekke jetje niet en doen niet aan handjes houden. :w

[ Voor 18% gewijzigd door RobIII op 15-09-2011 14:28 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1

Dit topic is gesloten.