[MSSQL] Distinct view Joinen met ander tabel/view

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Polderdijk
  • Registratie: December 2001
  • Laatst online: 16-09 09:45
Ik ben op dit moment bezig om ons eigen gemaakte webshop database (MSSQL 2000) uit te breiden van het princiepe "Categorie > Product" naar óf "Categorie > Product" óf Categorie > Sub Categorie > Product. Opzich lukt dit allemaal netjes, ook om er voor te zorgen dat de URL's SEO vriendelijk zijn (www.webshop.nl/Categorie/Subcategorie/Product.html ipv ?cat=223&subcat=456&productid=9876).

De categorie tabel heb ik hiervoor aangepast door een extra kolom parentid toe te voegen, welke refereerd naar een bovenliggende categorie, of een 0 als dit de hoofdcategorie is. Ook dit werkt perfect.

Nu wil het geval dat op de nieuw te bouwen 'grote' webshop bepaalde producten in meer dan 1 categorie kan voorkomen, en hier zit het probleem. Ik heb bijvoorbeeld een spotlight met de Top 10 best verkochte producten. Deze Top 10 wordt elke nacht met een ranking geupdate om op te ordenen met een door ons gemaakt algoritme wat in het product-tabel wordt opgeslagen, of het overzicht van het winkelwagentje.
Omdat het product in meerdere categorieen voorkomt, wordt het product ook 2x in de Top 10 gezet, met zoals verwacht linken naar de verschillende categorieen.

Nu heb ik geprobeerd om via een GROUP BY methode alle data te groeperen en via bijvoorbeeld MAX de hoogste data uit de database te halen. Echter er vinden diverse zaken in de SELECT statement plaats om bijvoorbeeld de URL opbouw te definieren, en dat lukt me niet met de GROUP BY methoden.

Ik dacht slim te zijn om een vieuw te maken welke alle filter en sorteringen maakt, en alleen een ProductId uitgeeft die DISTINCT is, dus allemaal uniek. Dit lukt prima en krijg een mooie lijst met unieke ProductId's terug.

Echter als ik deze via een andere view wil koppelen aan een ander tabel of view om alle data eruit te halen (productnaam, categorienaam, subcategorie, URL's, etc.) krijg ik de fout:

code:
1
Error Message: The text, ntext, or image data type cannot be selected as DISTINCT


Het lijkt erop dat SQL Server de beide vieuws 'uit elkaar' haalt en als een nieuwe vieuw uitvoert op de database, echter is dit niet mijn bedoeling.

Hoe kan ik ervoor zorgen, dat ik alleen het unieke ProductID van de ene vieuw kan JOINEN met een andere vieuw/tabellen/etc.

Omdat alles zeer complex is, zal ik hier geen voorbeeld query's neerzetten, maar als dit toch wenselijk is, hoor ik het wel.

Webhosting van SkyHost.nl: 25 Mb / 1 Gb windows hosting € 4,50 p/m excl.btw!


Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Wat wil je nu precies? Ik lees eerst een verhaal over je navigatie boom. En dan gaat de focus ineens naar de best verkochte producten. Ik zie eerlijk gezegd het verband niet. Je top 10 query levert toch gewoon 10 productid's op. Hoe kun je dan meerdere keren hetzelfde productid terug krijgen. Of een product nu aan 1 categorie is gekoppeld of aan 100 maakt toch helemaal niet uit voor het product zelf.

Waarschijnlijk is je grootste probleem dat je alles in 1 query probeert op te lossen. Waarom doe je het niet in 3 stappen.

Stap 1. Haal de top 10 op (global, per hoofdcatagorie of zelfs per subcat)
Stap 2. Haalt de product informatie zelf op (grootste kans dat je deze al in je (2nd level) cache hebt
Stap 3. Haal het navigatie path op waarbij je (sub)cat als startpunt gebruikt en vanzelf terug gaat in de boom.

Als je volgens het SOLID principe programmeert, is dit zelfs de voorgeschreven procedure.

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

  • Polderdijk
  • Registratie: December 2001
  • Laatst online: 16-09 09:45
Mijn verhaaltje over de boomstructuur heb ik juist erbij gezegt zodat je een beetje een goed inzicht krijgt wat er allemaal in de verschillende tabellen aanwezig is, en dus het probleem ook is dat als 2 producten voorkomt, deze automatisch gelinkt zitten aan de verschillende categorieen.
Je top 10 query levert toch gewoon 10 productid's op.
Ja klopt, als ik puur een selectie maakt op de producten die gekoppeld zijn aan de gekozen webshop, met een ordering op de product ranking. Zie de view die ik heb gemaakt die alleen maar 10 unieke ProductId's uitgeeft, dit gaat perfect.
Waarschijnlijk is je grootste probleem dat je alles in 1 query probeert op te lossen
Daar heb je helemaal gelijk in! En ik wil graag zo veel mogelijk info krijgen uit 1 query, daar mijn ervaring is dat een database server deze data veel sneller kan koppelen aan elkaar, dan dat ik tig query's moet afvuren om alleen al 1 spotlightje te vullen met data.

Ik kan het in 2 stappen doen, dus eerst alleen 10 ProductId's terugkrijgen, en daarna per ProductId de onderliggende informatie met aparte query's opvragen bij de database. Ik wil dit in 1 query, maar als ik dit op deze manier doet, kost me dit 11 query's!!
Aangezien de nieuwe site ongeveer 300.000 unieke bezoekers per maand trekt, met een ruime miljoen pageviews betekend dat dit mijn databaseserver dus pak-'m-beet 10 miljoen extra query's moet verwerken, dat noem ik nou niet echt efficient :S

Webhosting van SkyHost.nl: 25 Mb / 1 Gb windows hosting € 4,50 p/m excl.btw!