|
EAV, фасетный поиск
#39019256
Ссылка:
Ссылка на сообщение:
Ссылка с названием темы:
|
|
|
|
Есть таблицы EAV. Делаю фасетный поиск, К примеру, я задаю фильтр "ширина" и значение для него "300" (property_value_id =41).
Хочу получить все свойства товаров, которые есть у товаров, имеющих данное свойство и значение. Есть запрос, который возвращает значения для одного фильтра, но если фильтров несколько, например добавить запрос "длина" и значение "500" (property_value_id =200) то мне непонятно как написать. По идее я могу несколько раз выполнить этот запрос с разными фильтрами поиска и потом пересечь результаты, но хочется получить все сразу на sql.
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70.
SELECT pr.name,
pr.id AS property_id,
pv.value,
pv.id AS property_value_id,
pv.description AS description
FROM products AS p
INNER JOIN product_properties AS pp ON p.id = pp.product_id
INNER JOIN properties AS pr ON pp.property_id = pr.id
INNER JOIN property_values AS pv ON pp.property_value_id = pv.id
WHERE p.id IN
(SELECT p.id
FROM products p
INNER JOIN product_properties AS pp2 ON p.id = pp2.product_id
INNER JOIN properties AS pr2 ON pp2.property_id = pr2.id
INNER JOIN property_values AS pv2 ON pp2.property_value_id = pv2.id
WHERE p.product_type_id IN (28)
AND pp2.property_value_id =41
GROUP BY p.id)
AND pr.property_type = 'list'
GROUP BY pp.property_value_id
ORDER BY pp.property_id,
pv.value
CREATE TABLE `products` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`full_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`article` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`description` text COLLATE utf8_unicode_ci,
`product_type_id` int(11) DEFAULT NULL,
`is_visible` int(11) DEFAULT NULL,
`deleted` tinyint(4) DEFAULT '0',
PRIMARY KEY (`id`),
KEY `NewIndex4` (`article`) USING BTREE,
KEY `NewIndex3` (`product_type_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=10090 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
CREATE TABLE `properties` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`property_type` varchar(7) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `NewIndex5` (`property_type`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=44 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
CREATE TABLE `property_values` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`value` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`property_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `NewIndex1` (`property_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=508 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
CREATE TABLE `product_types` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=55 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
CREATE TABLE `property_values` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`value` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`property_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `NewIndex1` (`property_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=508 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
|
|
|