MySQL соединяет три таблицы, сумма элементов присоединяется к главной таблице


У меня есть три таблицы MySQL:

Например

  • Таблица-это идентификатор меню, имя

  • Таблица B-идентификатор customer_order, order_date

  • Таблица с order_item идентификатор, menu_item_id, customer_order_id, order_quantity

Я пытаюсь вывести имя, сумму (order_quantity) в этом месяце

В настоящее время у меня есть два отдельных запроса, которые работают нормально, но второй запрос находится внутри цикла foreach, который кажется не так хороший.

Первый запрос, который выводит все пункты меню:

$results = $wpdb->get_results( "SELECT * FROM menu WHERE post_id = $pid ORDER BY sort_order ");  

Второй запрос выведет итог каждого проданного товара за каждый месяц:

$total = $wpdb->get_col( "SELECT SUM(oi.order_item_quantity) 
                          from order_item as oi 
                          INNER JOIN customer_order as ho ON ho.ID = oi.order_id  
                          WHERE oi.order_item_id =  $subC->ID AND YEAR(ho.order_date) = $current_year AND MONTH(ho.order_date) = $current_month ");  
Я пытаюсь объединить два запроса в один запрос, который занял у меня целый день, но все еще не в состоянии решить его, может ли кто-нибудь помочь мне, пожалуйста.

Обновить

Спасибо Рене.

Select m.name, m.name as name, sum(oi.order_item_quantity) as sold_monthly from menu as m left join order_item as oi on oi.order_item_id = m.ID left join cusomter_order as co on co.ID = oi.order_id where m.post_id = 110  group by m.ID, m.name

Это выведет

 name                   sold_monthly    
Sushi Lunch Special     NULL
Sushi Lunch             19
Sashimi Lunch           61
jason                   NULL
egg roll                NULL

Если я добавлю YEAR(co.order_date) = 2016 AND MONTH(co.order_date) = 9

Который я получаю только

 name                   sold_monthly    
Sushi Lunch             7
Sashimi Lunch           14

Как могу ли я оставить суши-ланч особенным, Джейсон, яичный ролл, нулевой элемент, когда я добавляю YEAR(co.order_date) = 2016 AND MONTH(co.order_date) = 9.

Вот я и пытаюсь

(year(co.order_date) = 2016 and month(co.order_date) = 10) or sold_monthly is null 

Которые дают мне ошибку запроса

Обновление еще раз спасибо Рене

Теперь это работает

 (year(co.order_date) = 2016 and month(co.order_date) = 10) or co.order_date is null 

Наконец, решите его, у меня есть небольшая ошибка, когда я изменяю business_id, который может не поймать результат, который я хочу, поэтому я добавляю к нему подзапрос.

Select m.*, p.sold_monthly from menu as m left join ( SELECT SUM(oi.order_item_quantity) as sold_monthly, oi.order_item_id as ID, oi.order_item_name from order_item as oi LEFT JOIN cusomter_order as ho ON ho.ID = oi.order_id WHERE ho.business_id = $pid AND (year(ho.order_date) = $current_year and month(ho.order_date) = $current_month) OR ho.order_date is NULL GROUP by oi.order_item_id )p on p.ID = m.ID where m.post_id = $pid
1 2

1 ответ:

Таким образом, вы пытаетесь получить список на post_id, ограниченный выбранным месяцем. Следующий запрос даст это для следующих образцов данных.

SELECT m.ID as ID, m.Name as Name, SUM(oi.order_quantity) as Quantity
FROM menu as m
LEFT JOIN order_item as oi ON oi.menu_item_id = m.ID 
LEFT JOIN customer_order as co ON co.ID = oi.customer_order_id
WHERE m.post_id = 0 AND YEAR(co.order_date) = 2016 AND MONTH(co.order_date) = 9 OR co.order_date is NULL
GROUP BY m.ID,m.Name,m.sort_order
ORDER BY m.sort_order

Примерные Данные

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

DROP TABLE IF EXISTS `customer_order`;
CREATE TABLE `customer_order` (
  `ID` int(11) NOT NULL,
  `order_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_german2_ci;

TRUNCATE TABLE `customer_order`;
INSERT INTO `customer_order` (`ID`, `order_date`) VALUES
(1, '2016-09-06 00:00:00'),
(2, '2016-09-13 00:00:00'),
(3, '2016-08-09 00:00:00'),
(4, '2016-09-19 00:00:00');

DROP TABLE IF EXISTS `menu`;
CREATE TABLE `menu` (
  `ID` int(11) NOT NULL,
  `sort_order` int(11) NOT NULL,
  `post_id` int(11) NOT NULL,
  `Name` varchar(20) COLLATE utf8_german2_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_german2_ci;

TRUNCATE TABLE `menu`;
INSERT INTO `menu` (`ID`, `sort_order`, `post_id`, `Name`) VALUES
(2, 0, 0, 'Test 1'),
(4, 1, 0, 'Test 2'),
(5, 2, 0, 'Test 3');

DROP TABLE IF EXISTS `order_item`;
CREATE TABLE `order_item` (
  `ID` int(11) NOT NULL,
  `menu_item_id` int(11) NOT NULL,
  `customer_order_id` int(11) NOT NULL,
  `order_quantity` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_german2_ci;

TRUNCATE TABLE `order_item`;
INSERT INTO `order_item` (`ID`, `menu_item_id`, `customer_order_id`, `order_quantity`) VALUES
(1, 2, 1, 1),
(2, 2, 2, 3),
(3, 4, 1, 1),
(4, 4, 2, 4),
(5, 2, 3, 3),
(6, 4, 3, 1),
(7, 2, 4, 4);


ALTER TABLE `customer_order`
  ADD PRIMARY KEY (`ID`);

ALTER TABLE `menu`
  ADD PRIMARY KEY (`ID`),
  ADD KEY `idx_pid` (`post_id`);

ALTER TABLE `order_item`
  ADD PRIMARY KEY (`ID`),
  ADD KEY `idx_coid` (`customer_order_id`),
  ADD KEY `idx_miid` (`menu_item_id`);


ALTER TABLE `customer_order`
  MODIFY `ID` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5;
ALTER TABLE `menu`
  MODIFY `ID` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6;
ALTER TABLE `order_item`
  MODIFY `ID` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=8;

ALTER TABLE `order_item`
  ADD CONSTRAINT `CostomerOrderConstrain` FOREIGN KEY (`customer_order_id`) REFERENCES `customer_order` (`ID`),
  ADD CONSTRAINT `MenuItemConstrain` FOREIGN KEY (`menu_item_id`) REFERENCES `menu` (`ID`);

Удачи в интеграции запроса, дайте мне знать, если это сработает.

Обновление: обновленные образцы данных для воспроизведения фактической проблемы. Обновлен запрос решения.