#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», и это работает так, как я хочу. Спасибо за ваш ответ.