login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Query limit per "Groep" (Opgelost)

Offline GroundZero - 27/07/2015 14:34
Avatar van GroundZeroLid Beste,

ik heb een query waarbij ik alle producten ophaal van een bepaald merk. Binnen dit merk zijn er zes collecties. Ik sorteer op collectie omdat ik per collectie begin met een visual en daarna de producten pas.

Het probleem nu is, dat het op mobiel te zwaar word. Wat ik dus graag wil is de query aanpassen zodat deze per collectie maar 3 resultaten ophaalt.

Kan dit en zo ja hoe kan ik dit voor elkaar krijgen? ik heb wel het e.e.a. op internet gevonden maar dit ging mijn petje te boven haha. Misschien dat iemand een makkelijke manier weet.

Even een stukje voorbeeld code:

  1. while($fetch = mysql_fetch_assoc($cmd))
  2. {
  3. /**
  4. * IF NO IMAGE YET DISPLAY IT
  5. **/
  6. if(!in_array($fetch['ProdCategoryID'], $done))
  7. {
  8. // we know we have to start with a visual, but if we have a
  9. // pre-leading visual we have to start a new row so check
  10. if($num >= 1)
  11. {
  12. echo '</div>
  13. <div class="shop_show_more">
  14. <div class="collection" style="color:'.$colors[($num-1)].'">
  15. '.translater(idToName($fetch['ProdCategoryID'], $_SESSION['pLanguage'])).'
  16. </div>
  17. <a href="#" class="openUp" title="Meer weergeven" onclick="openUp(\''.($num-1).'\'); return false;">
  18. <div class="btn" id="btn-info-'.$x.'" style="background-color:'.$colors[($num-1)].'">
  19. Meer weergeven
  20. </div>
  21. </a>
  22. </div>
  23.  
  24. <div class="shop_ribbon">
  25. <img src="'.$ribbons[($num-1)].'" alt="Tommy Hilfiger Ribbon" />
  26. </div>
  27.  
  28. <div class="shop_fluid shop_fixed_height" id="shop_fluid_'.($num).'">
  29. <div id="smooth_'.$num.'"></div>
  30. <div class="shop_showoff">
  31. <img src="'.$images[$num].'" alt="" align="left" class="showoff" />
  32. </div>';
  33. }
  34. // this is the very first visual so we can just throw it
  35. // out here and display it
  36. else
  37. {
  38. echo '<div class="shop_fluid shop_fixed_height" id="shop_fluid_'.$num.'">
  39. <div id="smooth_'.$num.'"></div>
  40. <div class="shop_showoff">
  41. <img src="'.$images[$num].'" alt="" align="left" class="showoff" />
  42. </div>';
  43. }
  44. $num++;
  45. $done[] = $fetch['ProdCategoryID'];
  46. }
  47.  
  48. // hier worden de producten weergegeven
  49. $product = new Product($variabele);
  50. $product->blablabla;
  51. }



Stel dus dat ik het volgende heb:


20 shirts binnen collectie "mannen"
10 shirts binnen collectie "vrouwen"
80 shirts binnen collectie "zomer"
50 shirts binnen collectie "winter"

In plaats van 160 producten weer te geven, wil ik per collectie maar 3 producten selecteren.

Ik wil dit graag in één query doen zonder weer subqueries te gebruiken omdat dit de snelheid weer tegen gaat zitten.

Ik hoop dat ik het zo een beetje goed heb uitgelegd 

Mijn huidige query:

  1. $query = 'SELECT p.ProductNumber, p.assign_breda, p.lock_breda, ((p.nQtyAvailable + p.AvailableFromSupplier + nQtyAvailable_breda + p.nQtyAvailable_shop)> 0) as inVoorraad, pd.product_id,
  2. p.id, p.ProductType,p.ProductNumber, p.newcollection , p.ItemName, p.ItemNameSub, p.BrandID,
  3. p.nQtyAvailable,p.AvailableFromSupplier,p.nQtyAvailable_shop,p.nQtyAvailable_breda, p.Diameter, p.ProdCategoryID,
  4. p.SpecialOfferMIT,p.SpecialOfferPrice, p.InternetPrice,p.HighVAT, p.show_mm ,p.Diameter, p.for_men, p.for_women, p.for_girls, p.for_boys, p.BandSize'.$sql_base.'
  5. FROM Products AS p
  6. INNER JOIN products_domains AS pd
  7. ON
  8. p.id = pd.product_id
  9. LEFT JOIN NewCollection nc
  10. on nc.id = p.newcollection
  11. LEFT JOIN brandpage_product_sort bps
  12. on bps.pid = p.id
  13. WHERE
  14. pd.domain_id = "'.mysql_real_escape_string($g_iDomainID).'"
  15. AND (
  16. ProductType = 1
  17. AND
  18. BrandID = "'.mysql_real_escape_string($brandid).'"
  19. AND
  20. p.newcollection != 7)
  21. ORDER BY ProdCategoryID';

7 antwoorden

Gesponsorde links
Offline Jointjeff - 27/07/2015 15:12 (laatste wijziging 27/07/2015 15:13)
Avatar van Jointjeff HTML interesse Je kan dit doen door UNION te gebruiken. Een simpel voorbeeld:

  1. (SELECT * FROM producten WHERE collectie = 'winter' LIMIT 3)
  2. UNION
  3. (SELECT * FROM producten WHERE collectie = 'zomer' LIMIT 3)
  4. UNION
  5. (SELECT * FROM producten WHERE collectie = 'herfst' LIMIT 3)


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

--

Een andere optie is om je algemene query tot limiteren en vervolgens met paginering te werken. Als je het fancy wil doen kun je dan ook 'infinite scroll' toepassen. Daar zijn veel tutorials over te vinden.
Bedankt door: GroundZero
Offline GroundZero - 27/07/2015 15:29
Avatar van GroundZero Lid Hahaha kijk, dat is een simpel, kort maar krachtige oplossing. Beter dan een A4'tje vol met code en allemaal moeilijk doen.

Ik ga het proberen, dankjewel Jointjeff!
Offline Thomas - 27/07/2015 20:39
Avatar van Thomas Moderator Tevens: als je nieuwe code aan het schrijven bent zou ik (sterk) overwegen om gebruik te maken van MySQLi of PDO om met je MySQL-database te communiceren.

De standaard MySQL-driver (alle mysql_-functies) is namelijk al ~10 jaar verouderd en wordt (zeer) binnenkort uitgefaseerd.

Er is vrij recent een redelijk uitgebreide tutorial over MySQLi geschreven. Een (initiële) omzetting van MySQL naar (procedurele) MySQLi is niet eens zo heel ingewikkeld.
Bedankt door: Jointjeff
Offline GroundZero - 28/07/2015 14:33
Avatar van GroundZero Lid Thanks voor je reactie FangorN.

Klopt, doe normaal ook alles in MYSQLi alleen in dit project kan dit (nog) niet. In de toekomst wel. Is namelijk een server waarop 12 webwinkels draaien die wereldwijd (meerdere landen en meerdere talen) draait met een erg groot aantal bezoekers 24 uur per dag.

MYSQL naar MYSQLi zit in de planning maar is iets groots aangezien er voor 10 jaar werk in zit en dus véél bestanden nagelopen moeten worden omdat er verschillende mensen aan gewerkt hebben haha.

Word dus nog een leuke klus maar goed, wel een leuke uitdaging ;)
Offline Thomas - 28/07/2015 19:45 (laatste wijziging 28/07/2015 19:46)
Avatar van Thomas Moderator Mja, had je nu maar een wrappertje gebruikt , zoals aan het einde van de tutorial wordt aangehaald.

Nu zit er (mogelijk?) overal in je code:
  1. <?php
  2. $res = mysql_query('yadda');
  3. while ($row = mysql_fetch_assoc($res)) {
  4. // ...
  5. }
  6. ?>

Wat je fysiek zult moeten vervangen door:
  1. <?php
  2. $res = mysqli_query($dbLink, 'yadda');
  3. while ($row = mysqli_fetch_assoc($res)) {
  4. // ...
  5. }
  6. ?>


Maar wat als je nu zoiets had:
  1. <?php
  2. $res = $db->query('yadda');
  3. while ($row = $res->fetchResult()) {
  4. // ...
  5. }
  6. ?>

Dan had je kunnen volstaan met het enkel aanpassen van de implementaties van je database- en resultklasses. In het simpelste geval was je dan dus klaar geweest met het aanpassen van twee bestandjes (wel alles ff goed doortesten dan natuurlijk).

Oftewel: misschien moet je nu/in het vervolg ook gelijk ff goed nadenken over het (niet) hardcoden van dit soort functies.
Bedankt door: GroundZero
Offline GroundZero - 30/07/2015 12:29
Avatar van GroundZero Lid Goede suggestie, die ga ik zeker meenemen. Dankjewel FangorN!
Offline Thomas - 30/07/2015 13:53
Avatar van Thomas Moderator Dit lost trouwens je "probleem" slechts ten dele op: de "yadda" in je query is nog steeds letterlijke (mogelijk MySQL-specifieke) SQL-code (zie wederom dezelfde paragraaf in de tutorial).

Maar je hebt nu wel een uniforme ("anoniem gemaakte" / indirecte) manier voor het uitvoeren van MySQLi-functies. Dit is in principe ook wat PDO doet: je hebt een generieke manier om je data te benaderen (Data Access Abstraction Layer, kortweg DAAL), maar dit is dus geen Database Abstraction Layer, oftewel een extra laag die je queries (de SQL-code) ook omzet in een generieke, database-onafhankelijke variant (waarmee uiteindelijk uiteraard een database-specifieke query wordt gegenereerd). De vraag is natuurlijk hoe vaak je in de levensloop van een applicatie van database schakelt, en daarnaast heb je nog altijd te maken met database-specifieke features.

Dit wordt nog altijd onterecht als voordeel van PDO gebruikt: "ondersteuning voor meerdere databases"... maar je zit dus nog steeds met je database-specifieke SQL-code, aan PDO alleen heb je dus nog steeds niet genoeg.

Anyway, alles en meer staat in de tutorial. Ook een hoop notities over security. Ik zou je zeker aanraden dit een keer (grondig) door te lezen.
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.202s