Closed
Description
Hello dresende,
thank you very much for your work on this project, it helps me a lot. I'am using your orm for accessing mysql database with about 30M records and it works fine. So now I'm looking for some way to add custom condition to where clause.
Here is my SQL schema:
CREATE TABLE `category` (
`id` int(11) NOT NULL,
`name` varchar(1024) COLLATE utf8_czech_ci NOT NULL,
`url` varchar(200) COLLATE utf8_czech_ci NOT NULL,
`leaf` tinyint(4) NOT NULL DEFAULT '0',
`number_of_products` int(11) NOT NULL DEFAULT '0',
`path` varchar(800) COLLATE utf8_czech_ci NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `url` (`url`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;
CREATE TABLE `category_tree` (
`predecessor_id` int(11) NOT NULL,
`successor_id` int(11) NOT NULL,
`distance` int(11) NOT NULL,
PRIMARY KEY (`predecessor_id`,`successor_id`),
KEY `FK_category_tree_successor` (`successor_id`),
CONSTRAINT `FK_category_tree_predecessor` FOREIGN KEY (`predecessor_id`) REFERENCES `category` (`id`),
CONSTRAINT `FK_category_tree_successor` FOREIGN KEY (`successor_id`) REFERENCES `category` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;
CREATE TABLE `product` (
`id` int(11) NOT NULL,
`name` varchar(512) COLLATE utf8_czech_ci NOT NULL,
`description` text COLLATE utf8_czech_ci,
`rating` int(11) DEFAULT NULL,
`ean` varchar(20) COLLATE utf8_czech_ci DEFAULT NULL,
`price` decimal(14,2) DEFAULT NULL,
`image_url` varchar(1024) COLLATE utf8_czech_ci DEFAULT NULL,
`date` date NOT NULL,
PRIMARY KEY (`id`),
KEY `price` (`price`),
KEY `ean` (`ean`),
KEY `name` (`name`(180)),
KEY `date` (`date`),
CONSTRAINT `FK_category_product` FOREIGN KEY (`category_id`) REFERENCES `category` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;
CREATE TABLE `category_product` (
`category_id` int(11) NOT NULL,
`product_id` int(11) NOT NULL,
PRIMARY KEY (`category_id`,`product_id`),
KEY `product` (`product_id`),
CONSTRAINT `FK_category_product_category` FOREIGN KEY (`category_id`) REFERENCES `category` (`id`),
CONSTRAINT `FK_category_product_product` FOREIGN KEY (`product_id`) REFERENCES `product` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;
CREATE TABLE `property` (
`id` int(11) NOT NULL,
`name` varchar(200) COLLATE utf8_czech_ci NOT NULL,
`description` text COLLATE utf8_czech_ci,
`unit` varchar(512) COLLATE utf8_czech_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;
CREATE TABLE `property_value` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`value` varchar(512) COLLATE utf8_czech_ci NOT NULL,
`property_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `property_id_value` (`property_id`,`value`(200))
) ENGINE=InnoDB AUTO_INCREMENT=525900 DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;
CREATE TABLE `product_property_value` (
`product_id` int(11) NOT NULL,
`property_value_id` int(11) NOT NULL,
PRIMARY KEY (`product_id`,`property_value_id`),
KEY `property_value` (`property_value_id`),
CONSTRAINT `FK_product_property_value_product` FOREIGN KEY (`product_id`) REFERENCES `product` (`id`),
CONSTRAINT `FK_product_property_value_property_value` FOREIGN KEY (`property_value_id`) REFERENCES `property_value` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;
CREATE TABLE `category_property` (
`category_id` int(11) NOT NULL,
`property_id` int(11) NOT NULL,
PRIMARY KEY (`category_id`,`property_id`),
KEY `property_id` (`property_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;
I'm getting products for category by:
...
Category(category_id).getProducts( ...
...
SQL statement looks like this:
SELECT
`t1`.`id`, `t1`.`name`, `t1`.`ean`, `t1`.`price`, `t1`.`date`, `t1`.`description`, `t2`.*
FROM
`product` `t1`
JOIN `category_product` `t2` ON `t2`.`product_id` = `t1`.`id`
WHERE
(`t2`.`category_id` = 813)
ORDER BY
`t1`.`name` ASC
LIMIT 250 OFFSET 1250
But now I need to add filtering by property values which means adding another condition:
SELECT
`t1`.`id`, `t1`.`name`, `t1`.`ean`, `t1`.`price`, `t1`.`date`, `t1`.`description`, `t2`.*
FROM
`product` `t1`
JOIN `category_product` `t2` ON `t2`.`product_id` = `t1`.`id`
WHERE
(`t2`.`category_id` = 813)
AND EXISTS(
SELECT * FROM `product_property_value` WHERE `product_id` = `t1`.`id` AND `property_value_id` = 4564
)
ORDER BY
`t1`.`name` ASC
LIMIT 250 OFFSET 1250
So is there any correct way to do that?
Thank you very much,
kody