У меня ситуация, когда мне нужно получить ВСЕ продукты, ГДЕ 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 для






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.
@GiuseppeLodiRizzini, вы можете просто добавить еще одно условие JOIN
Я думаю, вы можете сделать это одним запросом, используя
havingиgroup by.