Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Правильность SQL запроса


nash

Recommended Posts

Добрый день!

Существует некоторая проблема. Есть товары с некоторыми артикулами: «A», «B», «C», «S».

В суммозависимых итогах ("учитывать в заказе") заказа есть такая позиция как "Упаковка" (переделал платную обработку заказа «handling»), которая зависит от наличия в корзине товаров с приведенными ранее артикулами. Если хотя бы один товар с любым из данных артикулов имеется в корзине, то упаковка стоит = 300р, если таких товаров нет, то упаковка = 200р.

 

в библиотеке корзины я сделал запрос: 

public function countProductsBox2() {
$query =  $this->db->query("SELECT SUM(quantity) as total_M2 FROM " . DB_PREFIX . "cart 
                  WHERE 
                  product_id IN (SELECT product_id FROM oc_product WHERE sku = 'A') OR 
                  product_id IN (SELECT product_id FROM oc_product WHERE sku = 'B') OR 
                  product_id IN (SELECT product_id FROM oc_product WHERE sku = 'C') OR 
                  product_id IN (SELECT product_id FROM oc_product WHERE sku = 'S') AND 
                  api_id = '" . (isset($this->session->data['api_id']) ? (int)$this->session->data['api_id'] : 0) . "' AND 
                  customer_id = '" . (int)$this->customer->getId() . "' AND 
                  session_id = '" . $this->db->escape($this->session->getId()) . "'");
return $query->row['total_M2'];
}

 

в модели «handling.php» я получаю количество данных товаров:

<?php
class ModelExtensionTotalHandling extends Model {
	public function getTotal($total) {
		$sub_total = $this->cart->getSubTotal();
		$countProdBox2 = $this->cart->countProductsBox2(); //получает количество товаров с упаковкой M2 и Б2

		$A = $this->config->get('handling_fee'); //наценка за коробки M и Б
		$B = $this->config->get('handling_fee2');//наценка за коробки M2 и Б2

		if (($sub_total > $this->config->get('handling_total')) && ($sub_total > 0)) {
			$this->load->language('extension/total/handling');

			$total['totals'][] = array(
				'code'       => 'handling',
				'title'      => $this->language->get('text_handling'),
				'value'      => ($countProdBox2 > 0) ? $B : $A, //$this->config->get('handling_fee')
				'sort_order' => $this->config->get('handling_sort_order')
			);

			if ($this->config->get('handling_tax_class_id')) {
				$tax_rates = $this->tax->getRates($this->config->get('handling_fee'), $this->config->get('handling_tax_class_id'));

				foreach ($tax_rates as $tax_rate) {
					if (!isset($total['taxes'][$tax_rate['tax_rate_id']])) {
						$total['taxes'][$tax_rate['tax_rate_id']] = $tax_rate['amount'];
					} else {
						$total['taxes'][$tax_rate['tax_rate_id']] += $tax_rate['amount'];
					}
				}
			}

			if($countProdBox2 > 0) {
				$total['total'] += $B; 
			}else {
				$total['total'] += $A;
			}
		}
	}
}

 

вопрос в том, что упаковка то нормально просчитывается, то неправильно. На скринах ниже момент, когда упаковка должна быть 199. Делаю вывод, что запрос написан неправильно. Что в нем не так? или не в запросе дело?

 image.thumb.png.2f5deb501d71bee8d9625de834723271.png

 

image.thumb.png.ef5461ae3ba6b3fcddbc104ee51bbd96.png

Надіслати
Поділитися на інших сайтах


02.03.2022 в 19:11, Blast сказал:
WHERE 
                  product_id IN (SELECT product_id FROM oc_product WHERE sku = 'A' OR sku = 'B' OR sku = 'C' OR sku = 'S') AND 
                  api_id ...

 

спасибо, затупок я. 

 

Из-за этого такая дичь происходила?

Надіслати
Поділитися на інших сайтах


02.03.2022 в 20:15, nash сказал:

спасибо, затупок я. 

 

Из-за этого такая дичь происходила?

булева алгебра иногда коварная штука. нужно внимательно подходить к расстановке AND и OR

Надіслати
Поділитися на інших сайтах

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку

×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.