• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zadanko z mysql

VPS Starter Arubacloud
0 głosów
365 wizyt
pytanie zadane 18 czerwca 2015 w PHP przez intoksynator Gaduła (3,450 p.)

Pomoże ktoś rozwiązać takie zadanko?

Zadanie 1.
W bazie mysql mamy między innymi 2 table (opisujące produkt i atrybuty tego produktu):
Między tabelami zachodzi relacja jeden do wielu.
Zadanie polega na skonstruowaniu zapytania sql w wyniku którego, dla znanego id produktu oznaczonego jako $id_product otrzymamy tablicę, w której znajdzie się id produktu oraz najniższa i najwyższa cena spośród wszystkich jego atrybutów, oznaczone odpowiednio id_product, attr_min i attr_max.
Przykładowa kwerenda mysql tworząca wspomniane wyżej table wraz z danymi:

CREATE TABLE `product` (
id_product int(10) unsigned NOT NULL auto_increment,
price decimal(20,6),
org_price decimal(20,6),
KEY `id_product` (`id_product`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE `product_attribute` (
id_product_attribute int(10) unsigned NOT NULL auto_increment,
id_product int(10),
price decimal(20,6),
org_price decimal(20,6),
KEY `id_product_attribute` (`id_product_attribute`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

insert into product values(1,20,20), (2,30,30);
insert into product_attribute values(1,1,20,20), (2,1,30,30), (3,1,40,40), (4,1,50,15), (5,2,12,20), (6,2,35,30), (7,2,23,340), (8,2,44,50);

 

Zadanie 2.
W koszyku sklepu internetowego mamy listę produktów przedstawioną jako tablica:

$products = array(1001 => 20.0, 122 => 35.60, 245 => 22.20, 89 => 400.10, 245 => 35.00, 1200 => 20.00);

Gdzie kluczem jest ID produktu, a wartością cena produktu.
Tworzymy akcję promocyjną, w której co drugi produkt, tańszy lub w tej samej samej cenie, jest przeceniany o 50%. Ilość produktów w koszyku może być dowolna.
Proszę napisać w PHP funkcję, która zawróci wartość całkowitego rabatu.

3 odpowiedzi

0 głosów
odpowiedź 18 czerwca 2015 przez Boshi VIP (100,240 p.)
edycja 18 czerwca 2015 przez Boshi
w 1 jak dobrze zrozumiałem masz wyciągnąć ID_produkt jego max i min cene z drugiej tabeli połączoną przez JOINA.

Czyli (ASCII) odpowiednio, id,max_cena,min_cena (dane przykłądowe)

| 5|120|5

w 2  dobrze to posortować po wartościach i potem  po przez modulo sprawdzać. Choć nie rozumiem co znaczy tańszy?  tańszy od czego? od poprzednika ? (Tylko w przypadku jak można naruszyć klucze)
0 głosów
odpowiedź 18 czerwca 2015 przez mowmiheniek Stary wyjadacz (11,900 p.)
W odp na 1 -  to rozumiem tak:

Z połączonych kolumn `price` i `org_price` wybieramy min AS attr_min i max AS attr_max

FROM `product_attribute`

WHERE  `id_product`= $id_product.
komentarz 18 czerwca 2015 przez intoksynator Gaduła (3,450 p.)
Dzięki wam Panowie za zainteresowanie.

 

Coś więcej co do pierwszego zadania? co tam za kodzik wkleić
0 głosów
odpowiedź 18 czerwca 2015 przez CzlowiekSkrypt Nałogowiec (26,340 p.)
edycja 18 czerwca 2015 przez CzlowiekSkrypt

Drugie zadanie zrobione na dziko ;) Zrozumiałem to tak że co drugi produkt jest w promocji jeśli jest tańszy od swojego poprzednika lub równy jego cenie. No i rozumiem że tablica w zadaniu jest przykładowa i można zadeklarować swoją.

Hard testing wypadł w miarę ok :P

 

$products = array(1 => 100, 2 => 99, 3 => 600, 4 => 50, 5 =>40, 6 => 199, 7=>24, 8 => 70, 9 => 55, 10 => 19, 11 => 15, 12=>15);
$temp = array();

for($i=1; $i<=count($products); $i++){
array_push($temp, $products[$i]);   // przechowujemy tu wszystkie ceny
	if($i % 2 == 0){                 //if odpala co 2 produkt
		$product = 	$products[$i];    // przypisujemy aktualna cene
		if($product <= $temp[$i-2]){   // porównujemy z poprzednia cena towaru
			$sale = $products[$i] / 2;   //dzielimy cene przez dwa
			echo $sale . "<br />";       //testowe wyswietlanie cen po promocji   
			@$cost += $sale;            //sumowanie kwoty promocyjnej
		}
	}
}

echo "Łączna kwota promocji: " . $cost;

Tak jak powiedziałem, jest to dziki kod, pewnie da się to zrobić lepiej :) Wszelkie uwagi i poprawki wskazane. W zadaniu jest że ma to być funkcja no to wystarczy to wpakować do funkcji i tyle, już mi się nie chce tego robić :)

komentarz 18 czerwca 2015 przez Boshi VIP (100,240 p.)
edycja 18 czerwca 2015 przez Boshi
Wiem, cały problem jest w operowaniu na co drugim kluczu bez znaczenia jaką ma wartość.
 Jasne, że mogę posortować to  sortem i potem użyć zwykłego modulo ale  chodzi  o to jak zachować ciagłąś kluczy.

 

Ja wymiękam przy tym na razie. Jeżeli klucze muszą być zachowane takie jak są to nie mam pojęcia jak to zrobić w prosty sposób. Każda metoda "co drugi element" wymaga jakiegoś indeksu, a my tutaj mamy ;

1 nieregularny  rozrzut kluczy

2  klucze mogące się powtarzać obok siebie.
komentarz 18 czerwca 2015 przez CzlowiekSkrypt Nałogowiec (26,340 p.)
hhmm no to mi nie da teraz spokoju, będę główkować też nad tym jeszcze :)
komentarz 18 czerwca 2015 przez Boshi VIP (100,240 p.)

Ja czasami nie myślę, albo mam jakąs  blokadę.. tak  banalne rozwiązanie a ja przeszukałem milion funkcji odnośnie tablic... ehhh

 


<?php



$product_shop=[1=>200,5=>150, 10=>343, 2=>654, 6=>333];
//asort($product_shop);


$second_array = [];
$i = 0;
foreach ($product_shop as $key=>$value) {
    if ($i % 2 == 0) {
        $second_array[$key] = $value;


            if (current($product_shop)>=next($product_shop))
               $second_array[$key] *= 0.5;
        }
    
    $i++;
}



echo "<pre>";

print_r($second_array);
echo "</pre>";

 

komentarz 18 czerwca 2015 przez CzlowiekSkrypt Nałogowiec (26,340 p.)

Brawo ! :)

Taka mała uwaga - nie powininen licznik $i startować od 1 ? Przy pierwszym warunku  dzieli 0%0 i chyba zwraca  logiczne 0 i to przepuszcza

Array
(
    [1] => 200
    [10] => 343
    [6] => 166.5
)

A jak ustawiłem na $i = 1 
Array
(
    [5] => 150
    [2] => 327
)

Tu ładnie wyswietliło co drugi element 

aha no i chyba warunek na odwrót :P 

Albo po prostu inaczej rozumiemy treść zadania która jest niejasna :)

komentarz 19 czerwca 2015 przez Boshi VIP (100,240 p.)
edycja 19 czerwca 2015 przez Boshi
Chyba jednak rozumiemy inaczej.  Z treści wynika, że co drugi ma być zmniejszony o 50% jeżeli poprzednik jest  droższy lub równy niż następnik

Czyli;

200 nie ma nic przed sobą i nie jest drugim towarem. ()numerujemy od 0)

150 nie jest drugim- odpada

343 jest drugim spełnia pierwszy warunek ale nie spełnia drugiego, bo poprzednik musi być większy lub równy co za tym idzie ten towar musi być tańszy lub równy co poprzednik czyli co 150 a 343>150 a nie <=

654 odpada bo nie jest  co drugim towarem

333 spełnia oba warunki, gdyż jest kolejnym towarem oraz jest mniejsze od 654 zatem tutaj obniżamy cene.

Tak to przynajmniej rozumiem.

Co do  tego 0 to zwraca true dlatego że porównujemy 2 liczby(inty) gdyby dać np 0===false to zwróci false bo jedno jest typu bool drugie int.

Tak w ogóle 0 jest parzyste także musi sie od 0 zaczać

Podobne pytania

0 głosów
3 odpowiedzi 1,692 wizyt
pytanie zadane 3 grudnia 2017 w PHP przez Krzysio4224 Obywatel (1,690 p.)
0 głosów
1 odpowiedź 152 wizyt
0 głosów
2 odpowiedzi 123 wizyt
pytanie zadane 25 października 2015 w PHP przez Silverwind Użytkownik (730 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...