Результат MySQL выберите СУММУ из базы данных

#mysql #sql

#mysql #sql

Вопрос:

У меня есть следующие таблицы, и я пытаюсь выбрать из table1, table2 и table3 и суммировать их в сумме:

 CREATE TABLE `tbl_cars` (
  `carID` int(11) NOT NULL,
  `car` varchar(255) NOT NULL,
  `product1` int(11) NOT NULL,
  `product1_amount` int(11) NOT NULL,
  `product2` int(11) NOT NULL,
  `product2_amount` int(11) NOT NULL,
  `product3` int(11) NOT NULL,
  `product3_amount` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `tbl_cars` (`carID`, `car`, `product1`, `product1_amount`, `product2`, `product2_amount`, `product3`, `product3_amount`) VALUES
(1, 'Kamacho 180 PS', 1, 10, 0, 0, 3, 10),
(2, 'Komoda 123 PS', 1, 20, 2, 20, 0, 0);

CREATE TABLE `tbl_orders` (
  `orderID` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  `ordered` varchar(255) NOT NULL,
  `pending` int(11) NOT NULL,
  `status` int(11) NOT NULL,
  `money` varchar(255) NOT NULL,
  `number` varchar(255) NOT NULL,
  `idcard` bigint(11) NOT NULL,
  `date` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  `account` varchar(255) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `tbl_orders` (`orderID`, `name`, `ordered`, `pending`, `status`, `money`, `number`, `idcard`, `date`, `account`) VALUES
(1, 'Some_Name', '1', 1, 0, '1000', '1822-25136145', 21474836471, '2020-11-26 05:44:00', '');

CREATE TABLE `tbl_prices` (
  `priceID` int(11) NOT NULL,
  `product` varchar(255) NOT NULL,
  `price` decimal(10,2) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- Daten für Tabelle `tbl_prices`
--

INSERT INTO `tbl_prices` (`priceID`, `product`, `price`) VALUES
(1, 'Rolle Stoff', 5.00),
(2, 'Rolle Pappe', 10.00),
(3, 'Eiesenbarren', 15.00),
(4, 'Rolle Stoff123', 20.00),
(5, 'Rolle Pappe123', 25.00),
(6, 'Eiesenbarren123', 30.00);
 

В настоящее время я сделал следующее

 SELECT product1_amount*price as total FROM tbl_prices, tbl_orders, tbl_cars WHERE orderID = '1' AND ordered = carID AND priceID = product1
UNION
SELECT product2_amount*price as total FROM tbl_prices, tbl_orders, tbl_cars WHERE orderID = '1' AND ordered = carID AND priceID = product2
UNION
SELECT product3_amount*price as total FROM tbl_prices, tbl_orders, tbl_cars WHERE orderID = '1' AND ordered = carID AND priceID = product3
 

Результат

 total
50
150
 

Пока все хорошо, но я ищу этот результат

 total
200
 

Я попытался с

 SELECT SUM(total) total FROM (
SELECT product1_amount*price as total FROM tbl_prices, tbl_orders, tbl_cars WHERE orderID = '1' AND ordered = carID AND priceID = product1
UNION
SELECT product2_amount*price as total FROM tbl_prices, tbl_orders, tbl_cars WHERE orderID = '1' AND ordered = carID AND priceID = product2
UNION
SELECT product3_amount*price as total FROM tbl_prices, tbl_orders, tbl_cars WHERE orderID = '1' AND ordered = carID AND priceID = product3
)t
GROUP BY total
 

но этот результат по-прежнему является тем же результатом, что и первый

 total
50
150
 

Искал около часа в Google, чтобы найти решение, и это была моя лучшая попытка получить какой-либо результат, который я ищу. Если есть и лучшее решение, я бы очень хотел узнать об этом больше.
В любом случае, любое исправление моего вопроса было бы потрясающим.

Редактировать:

пример данных http://sqlfiddle.com /#!9/c063a7/4

Комментарии:

1. Знаете ли вы, что в настоящее время выполняется перекрестное соединение между тремя таблицами? Вероятно, это не то, что вы хотите.

2. Я не новичок в SQL и пытаюсь понять, как это делается. Если у вас есть лучшее решение, я бы хотел увидеть, что я могу извлечь из этого урок.

3. Добавьте примерные данные к вашему вопросу.

4. Я добавил образец данных к своему вопросу

5. Если в вашем первом запросе вы не используете UNION ALL вместо UNION ??? Это изменило бы результат на 3 результата….

Ответ №1:

Если вы хотите найти общую сумму, вам нужно суммировать все отдельные итоги, а не объединять их

  SELECT
  ISNULL(( SELECT product1_amount*price as total FROM tbl_prices, tbl_orders, tbl_cars WHERE orderID = '1' AND ordered = carID AND priceID = product1 ),0)
   
  ISNULL(( SELECT product2_amount*price as total FROM tbl_prices, tbl_orders, tbl_cars WHERE orderID = '1' AND ordered = carID AND priceID = product2 ),0)
   
  ISNULL(( SELECT product3_amount*price as total FROM tbl_prices, tbl_orders, tbl_cars HERE orderID = '1' AND ordered = carID AND priceID = product3),0)
 as total;
 

Комментарии:

1. Проблема с этим предложением заключается в том, что если product1 = 10, product2 = NULL и product3 = 20, результат будет НУЛЕВЫМ из-за product2 = NULL . Есть ли какое-либо решение для исправления этого?

2. Да, вы правы. Я обновлю свой ответ, чтобы учесть это. Спасибо, что выяснили это

3. Проблема с «ISNULL» не работает для меня. Поэтому я изменил его на «IFNULL», и это работает так, как я хочу. Спасибо за ваш ответ.