Mysql return, где сумма значений меньше значения из другой таблицы

У меня ситуация, когда мне нужно получить ВСЕ продукты, ГДЕ Alert - ИСТИНА, значение MininumAlert <суммы количества продуктов в каждом магазине и StoreDetail.Search = 1. Например:

таблица Продукт:

-------------------------------------
| ID | Name  | MinimumAlert | Alert |
-------------------------------------
| 1  | Prod1 |   100        |   1   |
-------------------------------------
| 2  | Prod2 |   150        |   1   |
-------------------------------------
| 3  | Prod3 |   500        |   1   |
-------------------------------------
| 4  | Prod4 |              |   0   |
-------------------------------------
| 5  | Prod5 |   110        |   1   |

таблица StoreDetail:

------------------------------
| ID | Name  | Search       | 
-----------------------------
| 100  | Store1|   1          |   
------------------------------
| 101  | Store2|   1          |  
------------------------------
| 102  | Store3|   1          |  
-----------------------------
| 103  | Store4|   1          |  
------------------------------
| 104  | Store5|   1          | 

Таблица Магазин:

-------------------------------------
| ID | Store_ID| Qty          | Prod_ID|
-------------------------------------
| 1  | 100     |   5          |   1   |
-------------------------------------
| 2  | 101     |   90         |   1   |
-------------------------------------
| 4  | 100     |   400        |   2   |
-------------------------------------
| 5  | 101     |   30         |   2   |
-------------------------------------
| 6  | 100     |   450         |   3   |
 -------------------------------------
| 7  | 100     |   99         |   4   |
 -------------------------------------
| 8  | 100     |   98         |   5   |
 -------------------------------------
| 9  | 101     |   2          |   5   |
-------------------------------------
| 10  | 102     |   3          |   5   |

Я не знаю, как получить идентификаторы из (Таблица товаров) за ОДИН ЗАПРОС. На самом деле я использую такую ​​функцию в PHP (используя 2 запроса: 1 внутри функции get_all_products и еще один внутри функции get_stores_by_prod_ID):

function get_products_under_minimum() {

   $result = array();

   $all_products = get_all_products(); //SELECT * FROM Product

   foreach ( $all_products as $product ) {
     if ( $product['Alert'] ) {
       $total = 0;
       $all_stores_product = get_stores_by_prod_ID( $product['ID'] ); // SELECT * FROM Store WHERE Prod_ID = $product['ID']
       foreach ( $all_stores_product as $store) {
           $info_store = get_info_store($store['Store_ID']); // SELECT * FROM StoreDetail WHERE ID = ?
           if ( $info_store['Search'] ) {
            $total = $total + $store['Qty'];
           }
       }

       if ( $total < $product['MinimumAlert'] ) {
          $result[] = $product['ID'];
       }

     }
   }

   return $result;

}

Исходя из моих правил, мне нужно получить:

ID 1 cause Alert is true, Search is true and SUM(5+90) is < 100
ID 3 cause Alert is true, Search is true and SUM(450) is < 500
ID 5 cause Alert is true, Search is true and SUM(98+2+3) is < 110

Я бы хотел, если возможно, использовать только один запрос QUERY для

Я думаю, вы можете сделать это одним запросом, используя having и group by.

user3783243 27.11.2018 14:39
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
1
44
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

JOIN между таблицами, используя их соответствующие отношения. Затем мы можем GROUP BY по идентификатору продукта, имени и минимальному предупреждению (для совместимости с режимом only_full_group_by).

Затем мы можем использовать функцию SUM() для расчета общего количества Qty во всех магазинах и использовать предложение HAVING для рассмотрения тех продуктов, где MinimumAlert больше, чем общее количество магазинов.

SELECT p.ID, p.Name, p.MinimumAlert, 
       SUM(s.Qty) AS total_store_qty 
FROM product p
JOIN store s ON s.Prod_ID = p.ID 
JOIN storedetail sd ON sd.ID = s.Store_ID 
WHERE p.alert = 1 AND 
      sd.search = 1 
GROUP BY p.ID, p.Name, p.MinimumAlert
HAVING p.MinimumAlert > total_store_qty

Привет, спасибо за ответ. Я забыл другой столик, извините. Я добавил сейчас: StoreDetail. Мне нужно также фильтровать Search = true.

Giuseppe Lodi Rizzini 27.11.2018 14:49

@GiuseppeLodiRizzini, вы можете просто добавить еще одно условие JOIN

Madhur Bhaiya 27.11.2018 14:50

Другие вопросы по теме