Перейти к публикации
  • разработка интернет магазинов на opencart
  • доработка интернет магазинов на opencart

Правильность 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. Делаю вывод, что запрос написан неправильно. Что в нем не ик? или не в запросе гдело?

 

 

Ссылка на комменирий
Погделиться на других сайих


  02.03.2022 в 14: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 в 17:15, nash сказал:

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

 

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

Раскрыть  

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

Ссылка на комменирий
Погделиться на других сайих

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы осивить комменирий

Создать аккаунт

Зарегистрируйтесь для получения аккауни. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите згдесь.

Войти сейчас
 Погделиться

×
×
  • Создать...

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

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