Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...

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


nash
 Поделиться

Рекомендованные сообщения

Добрый день!

Существует некоторая проблема. Есть товары с некоторыми артикулами: «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 пользователей

    • Нет пользователей, просматривающих эту страницу.
×
×
  • Создать...

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.