Panchous
Павел
Сложный запрос
Таблица продуктов: product
[sql]
CREATE TABLE `product` (
`product_id` int(10) unsigned NOT NULL auto_increment,
`category_id` int(10) unsigned NOT NULL default '0',
`title` varchar(50) NOT NULL default '',
`description` tinytext,
`price` decimal(5,2) unsigned NOT NULL default '0.00',
`presence` tinyint(1) NOT NULL default '0',
`image` varchar(20) NOT NULL default '',
`leader_image` varchar(20) default NULL,
`leader_order` tinyint(1) default NULL,
`hot_image` varchar(20) default NULL,
`hot_order` tinyint(1) default NULL,
PRIMARY KEY (`product_id`),
KEY `category_id` (`category_id`),
CONSTRAINT `product_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `catalog` (`category_id`) ON DELETE CASCADE ON UPDA
TE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=cp1251
[/sql]
Таблица ключей продуктов: product_key
[sql]CREATE TABLE `product_key` (
`file_id` int(10) unsigned NOT NULL auto_increment,
`product_id` int(10) unsigned default NULL,
`order_id` int(10) unsigned default NULL,
`filename` varchar(20) NOT NULL default '',
PRIMARY KEY (`file_id`),
KEY `product_id` (`product_id`),
KEY `order_id` (`order_id`),
CONSTRAINT `product_key_ibfk_5` FOREIGN KEY (`product_id`) REFERENCES `product` (`product_id`),
CONSTRAINT `product_key_ibfk_6` FOREIGN KEY (`order_id`) REFERENCES `user_order` (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1251
[/sql]
Таблица заказов: user_order
[sql]CREATE TABLE `user_order` (
`order_id` int(10) unsigned NOT NULL auto_increment,
`user_id` int(10) unsigned NOT NULL default '0',
`service_id` tinyint(3) unsigned NOT NULL default '0',
`reg_date` datetime NOT NULL default '0000-00-00 00:00:00',
`payment_date` datetime default NULL,
`perform_date` datetime default NULL,
`sum` decimal(5,2) default NULL,
PRIMARY KEY (`order_id`),
KEY `user_id` (`user_id`),
KEY `service_id` (`service_id`),
CONSTRAINT `user_order_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `user` (`user_id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `user_order_ibfk_2` FOREIGN KEY (`service_id`) REFERENCES `pay_service` (`service_id`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1251
[/sql]
ВОПРОС:
Можно ли одним запросом сделать следующую выборку...
Выбрать для всех продуктов:
наименование, кол-во свободных ключей (у которых order_id=NULL) и кол-во проданных ключей за определенный период (смотрится по полям связанного заказа)?
Версия MySQL: 4.1.
Спасибо.
-~{}~ 22.02.06 12:17:
[sql]select p.title, count(k_sell.product_id) AS sell_count, count(k_free.product_id) AS free_count
from product p
left outer join product_key k_free on (p.product_id=k_free.product_id and k_free.order_id is null)
left outer join product_key k_sell
on (p.product_id=k_sell.product_id and k_sell.order_id in
(select o.order_id from user_order o where DATE(o.perform_date) between '2005-01-01' and '2006-02-21')
)
group by p.title[/sql]
-~{}~ 22.02.06 12:42:
проблема не решена до конца(
каждый отдельный JOIN считается правильно,
но если в запросе оставить оба - цыфры вылазят запредельные...
может, еще какая группировка нужна?
Таблица продуктов: product
[sql]
CREATE TABLE `product` (
`product_id` int(10) unsigned NOT NULL auto_increment,
`category_id` int(10) unsigned NOT NULL default '0',
`title` varchar(50) NOT NULL default '',
`description` tinytext,
`price` decimal(5,2) unsigned NOT NULL default '0.00',
`presence` tinyint(1) NOT NULL default '0',
`image` varchar(20) NOT NULL default '',
`leader_image` varchar(20) default NULL,
`leader_order` tinyint(1) default NULL,
`hot_image` varchar(20) default NULL,
`hot_order` tinyint(1) default NULL,
PRIMARY KEY (`product_id`),
KEY `category_id` (`category_id`),
CONSTRAINT `product_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `catalog` (`category_id`) ON DELETE CASCADE ON UPDA
TE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=cp1251
[/sql]
Таблица ключей продуктов: product_key
[sql]CREATE TABLE `product_key` (
`file_id` int(10) unsigned NOT NULL auto_increment,
`product_id` int(10) unsigned default NULL,
`order_id` int(10) unsigned default NULL,
`filename` varchar(20) NOT NULL default '',
PRIMARY KEY (`file_id`),
KEY `product_id` (`product_id`),
KEY `order_id` (`order_id`),
CONSTRAINT `product_key_ibfk_5` FOREIGN KEY (`product_id`) REFERENCES `product` (`product_id`),
CONSTRAINT `product_key_ibfk_6` FOREIGN KEY (`order_id`) REFERENCES `user_order` (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1251
[/sql]
Таблица заказов: user_order
[sql]CREATE TABLE `user_order` (
`order_id` int(10) unsigned NOT NULL auto_increment,
`user_id` int(10) unsigned NOT NULL default '0',
`service_id` tinyint(3) unsigned NOT NULL default '0',
`reg_date` datetime NOT NULL default '0000-00-00 00:00:00',
`payment_date` datetime default NULL,
`perform_date` datetime default NULL,
`sum` decimal(5,2) default NULL,
PRIMARY KEY (`order_id`),
KEY `user_id` (`user_id`),
KEY `service_id` (`service_id`),
CONSTRAINT `user_order_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `user` (`user_id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `user_order_ibfk_2` FOREIGN KEY (`service_id`) REFERENCES `pay_service` (`service_id`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1251
[/sql]
ВОПРОС:
Можно ли одним запросом сделать следующую выборку...
Выбрать для всех продуктов:
наименование, кол-во свободных ключей (у которых order_id=NULL) и кол-во проданных ключей за определенный период (смотрится по полям связанного заказа)?
Версия MySQL: 4.1.
Спасибо.
-~{}~ 22.02.06 12:17:
[sql]select p.title, count(k_sell.product_id) AS sell_count, count(k_free.product_id) AS free_count
from product p
left outer join product_key k_free on (p.product_id=k_free.product_id and k_free.order_id is null)
left outer join product_key k_sell
on (p.product_id=k_sell.product_id and k_sell.order_id in
(select o.order_id from user_order o where DATE(o.perform_date) between '2005-01-01' and '2006-02-21')
)
group by p.title[/sql]
-~{}~ 22.02.06 12:42:
проблема не решена до конца(
каждый отдельный JOIN считается правильно,
но если в запросе оставить оба - цыфры вылазят запредельные...
может, еще какая группировка нужна?