Mam pytanie. Otóż mam tabelę produktów oraz drugą tabelę w kórej jest określony narzut na danych produkt dla danaego użytkownika. Ta druga ma 3 kolumny
idProducts, idUsers, surcharge
I teraz w trakcie pobieranie listy produktów są obliczane ceny dla użytkowknika który jest zalogowany do systemu. Jeśli w tabeli z określonymi narzutami znajdzie się rekord dla danego usera i produktu to jest brana wartość narzutu dla tego rekordu jeśli natomiast nie ma to jest brana jakaś domyślna wartośc narzutu jaka została określona dla tego usera.
I teraz mam takie zapytanie. W nim obliczam wartość ceny sprzedaży netto i brutto, ale jak widac dwukrotnie są sprawdzane pola i wykonywane operacje matematyczne.
W przykładzie jest brany pod uwagę user o id = 1
SET @surcharge = 10; ///TO jest jakaś wartość domyślnego narzutu procentowego dla danego danego usera SELECT p.name,up.surcharge, IF(ISNULL(up.surcharge),ROUND((p.netPurchasePrice * (1 + (@surcharge/100))),2),ROUND((p.netPurchasePrice * (1 + (up.surcharge/100))),2)) AS netSalesPrice, IF(ISNULL(up.surcharge),ROUND((p.netPurchasePrice * (1 + (p.tax/100)) * (1 + (@surcharge/100))),2),ROUND((p.netPurchasePrice * (1 + (up.surcharge/100))),2)) AS grossSalesPrice FROM products AS p LEFT JOIN users_products AS up ON p.idProducts = up.idProducts AND up.idUsers = 1 WHERE p.activity = 1
W tej wersji jest tak że wartośc ceny sprzedaży netto przypisuję do zmiennej i ją wykorzystuję do obliczenia ceny brutto
SET @surcharge = 10; ///TO jest jakaś wartość domyślnego narzutu procentowego dla danego danego usera SELECT p.name,up.surcharge, IF(ISNULL(up.surcharge),@netSalesPrice:= ROUND((p.netPurchasePrice * (1 + (@surcharge/100))),2),@netSalesPrice:= ROUND((p.netPurchasePrice * (1 + (up.surcharge/100))),2)) AS netSalesPrice, (@netSalesPrice * (1 + (p.tax/100))) AS grossSalesPrice FROM products AS p LEFT JOIN users_products AS up ON p.idProducts = up.idProducts AND up.idUsers = 1 WHERE p.activity = 1
Wydaje mi się że to drugie rozwiazanie powinno być wydajniejsze i szybsze choć jakoś za bardzo nei widzę różnicy w czasie wykonywanie zapytania. Co sądzicie o tym ?