Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Optymalne rozwiązanie
Forum PHP.pl > Forum > PHP
nexis
Mój problem wygląda następująco:


- Posiadam cennik, który raz na dobę importuje ponad 16 000 produktów do bazy danych MySQL.
- Cenny w cenniku są cenami hurtowymi, więc chciałbym do nich doliczyć odpowiednie marże.
- Marże mają być dla konkretnych przedziałów cenowych i ma to być stała kwota (nie procent ceny).


W bazie danych MySQL utworzyłem tabelę do przechowania marż o następującej strukturze:

  1. ##################################
  2. # odKwoty # doKwoty # marza #
  3. ##################################
  4. # 0.00 # 99.99 # 10.00 #
  5. # 100.00 # 199.99 # 20.00 #
  6. # 200.00 # 299.99 # 30.00 #
  7. # 300.00 # 399.99 # 40.00 #
  8. # 400.00 # 499.99 # 50.00 #
  9. # 500.00 # 599.99 # 60.00 #
  10. # 600.00 # 699.99 # 70.00 #
  11. # 700.00 # 799.99 # 80.00 #
  12. # 800.00 # 899.99 # 90.00 #
  13. # 900.00 # 999.99 # 100.00 #
  14. # 1000.00 # 99999999.99 # 200.00 #
  15. ##################################


Z uwagi na to, że produktów jest dość dużo i chciałbym jak najmądrzej wykorzystać zasoby serwera. I stąd moje pytanie:

w jaki sposób najlepiej rozwiązać mój problem? Pobrać przedziały cenowe do tablicy i jak wtedy na nich operować? Czy MySQL potrafiłby zrealizować takie obliczenia (produkty po imporcie też są w tabelce)?

Dodam jeszcze, że z założenia przedziały cenowe nie pokrywają się i nie występują przerwy (tzw. czarne dziury).
ShadowD
Można zamienić to w funkcje przykład:

*wszystkie dane możesz pobierać z mysql
*można to na pewno ładniej zapisać
*200 na dole to cena towaru


  1. <?php
  2. function cenapluswat($qwqw)
  3. {
  4.  
  5. $cena[nokia][n]=$qwqw;
  6.  
  7. $cena[0][n]=0; 
  8. $cena[0][w]=10;
  9. $cena[1][n]=100; 
  10. $cena[1][w]=20;
  11. $cena[2][n]=200; 
  12. $cena[2][w]=30;
  13. $cena[3][n]=300; 
  14. $cena[3][w]=40;
  15. $cena[4][n]=400; 
  16. $cena[4][w]=50;
  17. $cena[5][n]=500; 
  18. $cena[5][w]=60;
  19.  
  20. if($cena[nokia][n]>=$cena[1][n])
  21. {
  22. if($cena[nokia][n]>=$cena[2][n])
  23. {
  24. if($cena[nokia][n]>=$cena[3][n])
  25. {
  26. if($cena[nokia][n]>=$cena[4][n])
  27. {
  28. if($cena[nokia][n]>=$cena[5][n])
  29.  
  30. echo"itd";
  31.  
  32. } else {$wartosc=$cena[nokia][n]+$cena[3][w]; echo "$wartosc"; }
  33. } else {$wartosc=$cena[nokia][n]+$cena[2][w]; echo "$wartosc"; }
  34. } else {$wartosc=$cena[nokia][n]+$cena[1][w]; echo "$wartosc"; }
  35. } else {$wartosc=$cena[nokia][n]+$cena[0][w]; echo "$wartosc"; }
  36. }
  37. ?>

I wywołujesz:
  1. <?php
  2. echo cenapluswat('200');
  3. ?>
dr_bonzo
  1. UPDATE cennik SET cena_z_marza = cena_bazowa + 10 WHERE cena_bazowa BETWEEN 0.00 AND 99.99
(ew. uzyj >= 0 i < 100.00)

i to robisz dla kazdego z przedzialow
nexis
Użycie MySQL jest chyba faktycznie najrozsądniejsze. Dodam tylko jeszcze dla przyszłych czytelników tego tematu, że ważne jest, aby posortować marże malejąco, ponieważ w przeciwnym przypadku produkt po doliczeniu marży może osiągnąć kolejny próg i marża zostanie doliczona dwu- lub wielokrotnie.

Moje rozwiązanie:

  1. <?php
  2. $result = $db->query
  3. ("
  4. SELECT
  5. odKwoty,
  6. doKwoty,
  7. marza
  8. FROM sklep_marza
  9. ORDER BY doKwoty DESC
  10. ");
  11. while($row = $result->fetch_assoc())
  12. {
  13. $db->query
  14. ("
  15. UPDATE
  16. sklep_produkt
  17. SET
  18. cena_netto = (cena_netto+" . $row['marza'] . "),
  19. cena_brutto = (cena_netto*1.22)
  20. WHERE
  21. cena_netto BETWEEN " . $row['odKwoty'] . " AND " . $row['doKwoty'] . "
  22. "); 
  23. }
  24. $result->close();
  25. ?>
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.