ОК, поэтому я столкнулся с этой чрезвычайно сложной проблемой, и поскольку я не являюсь гуру с MySQL, мне определенно нужен ваш вклад.Сложная проблема с запросами MySQL
Допустим, у нас есть база данных, созданная с помощью кода ниже (я скопировав код создания - только из абсолютно-необходимых таблиц - избежать вставки всех таблиц):
DROP TABLE IF EXISTS `Jeweller`.`Orders`;
CREATE TABLE `Jeweller`.`Orders` (
`id` int(11) unsigned NOT NULL,
`date` date DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `Jeweller`.`Product_categories`;
CREATE TABLE `Jeweller`.`Product_categories` (
`id` int(11) unsigned NOT NULL,
`name` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `Jeweller`.`Product_orders`;
CREATE TABLE `Jeweller`.`Product_orders` (
`order_id` int(11) unsigned NOT NULL,
`product_id` int(11) unsigned NOT NULL,
`quantity` int(11),
`value` float,
FOREIGN KEY (`order_id`) REFERENCES `Jeweller`.`Orders`(`id`),
FOREIGN KEY (`product_id`) REFERENCES `Jeweller`.`Products`(`id`),
CHECK (`quantity`>0),
CHECK (`value`>0)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `Jeweller`.`Product_returns`;
CREATE TABLE `Jeweller`.`Product_returns` (
`sale_id` int(11) unsigned NOT NULL,
`product_id` int(11) NOT NULL,
`date` date DEFAULT NULL,
`quantity` int(11),
`value` float,
FOREIGN KEY (`sale_id`) REFERENCES `Jeweller`.`Sales`(`id`),
FOREIGN KEY (`product_id`) REFERENCES `Jeweller`.`Products`(`id`),
CHECK (`quantity`>0),
CHECK (`value`>0)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `Jeweller`.`Product_sales`;
CREATE TABLE `Jeweller`.`Product_sales` (
`sale_id` int(11) unsigned NOT NULL,
`product_id` int(11) NOT NULL,
`quantity` int(11),
`value` float,
FOREIGN KEY (`sale_id`) REFERENCES `Jeweller`.`Sales`(`id`),
FOREIGN KEY (`product_id`) REFERENCES `Jeweller`.`Products`(`id`),
CHECK (`quantity`>0),
CHECK (`value`>0)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `Jeweller`.`Products`;
CREATE TABLE `Jeweller`.`Products` (
`id` int(11) unsigned NOT NULL,
`product_category_id` int(11) NOT NULL,
`seller_id` int(11) NOT NULL,
`name` varchar(100) NOT NULL,
`description` text,
PRIMARY KEY (`id`),
FOREIGN KEY (`product_category_id`) REFERENCES `Jeweller`.`Product_categories`(`id`),
FOREIGN KEY (`seller_id`) REFERENCES `Jeweller`.`Sellers`(`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `Jeweller`.`Sales`;
CREATE TABLE `Jeweller`.`Sales` (
`id` int(11) unsigned NOT NULL,
`date` date DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Теперь, учитывая, что мы определяем прибыль как:
Sales - Returns - Orders
Как бы вы идти о запросе на выборку:
Прибыль за месяц И PRODUCT_CATEGORY, только за год 2013.
Для целей тестирования, вот полный DB Creation code, а также DB Population code (с некоторые демо-данные). (SQLFiddle link)
P.S.
Фактический код своего рода отличается (выше это только пример - хотя 100% лояльны один)
После нескольких попыток мне удалось только фильтр 2013 продаж/заказов/и т.д. ... Мне даже удалось получить прибыль по продукту (хотя для этого потребовалось несколько бесконечных
join
,left outer join
и т. Д. ... lol) ... Однако это выглядит намного сложнее. Есть идеи?
Не используйте FLOAT для этого. Это (почти наверняка) десятичные числа, а не числа с плавающей запятой. – Strawberry
@Strawberry Well Я сделал это - для целей примера - для представления значений (цен), которые могут быть даже похожими на «200.30», а не целыми числами ... –
Да. Это десятичные числа. Ох и ограничения внешнего ключа не имеют никакого значения в MyISAM, поэтому давайте проигнорируем их пока ... – Strawberry