Relacje:
"products" 1 -> wielu "products_gallery"
"products" 1 -> wielu "products_categories"
Chce pobrać wszystkie grafiki produktów, informacje o produkcie z listy produktó∑, któ®e należą do pewnej grupy kategorii.
Moje zapytanie ma postać:
SELECT p.productID, p.prod_title, p.prod_iconS, p.prod_price, p.prod_url, pg.prod_photo_transp, pg.prod_photo_thmb, pg.prod_photo_id FROM products AS p, products_categories AS pc, products_gallery AS pg WHERE pc.catID IN (4, 8, 9, 10, 11, 12, 13, 14) AND p.productID=pc.productID AND p.productID=pg.prod_productID AND p.prod_visible='yes' ORDER BY p.prod_date_pub DESC LIMIT 0 , 50
ale to zapytanie trwa prawie 3 sekundy i dodatkowo "wiesza się" przy większej liczbie kategorii (ponad 10 kategorii).
Struktura tabel:
PRODUCTS:
CREATE TABLE IF NOT EXISTS `products` ( `productID` int(11) NOT NULL AUTO_INCREMENT, `prod_type` smallint(2) DEFAULT NULL, `prod_title` varchar(100) NOT NULL DEFAULT '', `prod_desc` text NOT NULL, `prod_distributor` int(8) NOT NULL, `prod_producent` varchar(40) DEFAULT NULL, `prod_url` varchar(300) NOT NULL DEFAULT '', `prod_iconS` varchar(100) NOT NULL DEFAULT '', `prod_iconB` varchar(100) NOT NULL DEFAULT '', `prod_price` decimal(20,2) NOT NULL DEFAULT '0.00', `prod_default_price` decimal(20,2) NOT NULL, `prod_currency` varchar(5) NOT NULL, `prod_colors` text, `prod_external` text, `prod_date_pub` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `prod_visible` enum('yes','no') NOT NULL DEFAULT 'yes', `prod_status` enum('normal','promo') NOT NULL DEFAULT 'normal', `prod_rating` enum('yes','no') NOT NULL DEFAULT 'yes', `prod_approved` enum('yes','no') NOT NULL, `prod_comments` enum('yes','no','logged_in') NOT NULL DEFAULT 'no', `prod_cdn` tinyint(1) NOT NULL DEFAULT '0' COMMENT '0=do wgrania', PRIMARY KEY (`productID`), KEY `prod_distributor` (`prod_distributor`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=4764 ;
PRODUCTS_GALLERY:
CREATE TABLE IF NOT EXISTS `products_gallery` ( `prod_photo_id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, `prod_color` text NOT NULL, `prod_photo_filename` varchar(50) DEFAULT NULL, `prod_photo_thmb` varchar(50) DEFAULT NULL, `prod_photo_transp` varchar(50) NOT NULL, `prod_photo_desc` text, `prod_productID` int(8) UNSIGNED NOT NULL, `prod_photo_q` int(2) NOT NULL DEFAULT '5' COMMENT '0 - the best', `prod_photo_order` float DEFAULT '0', `prod_photo_cdn` tinyint(1) NOT NULL DEFAULT '0' COMMENT '0=do wgrania', PRIMARY KEY (`prod_photo_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=4957 ;
PRODUCTS_CATEGORIES:
CREATE TABLE IF NOT EXISTS `project_categories` ( `catID` int(5) UNSIGNED NOT NULL, `proID` int(8) UNSIGNED NOT NULL, KEY `catID` (`catID`), KEY `proID` (`proID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Jakieś propozycje?