16. Мелкий - 13 Мая, 2015 - 17:52:05 - перейти к сообщению
Данке, исправил.
17. Sheehave - 13 Мая, 2015 - 23:04:14 - перейти к сообщению
Мелкий пишет:
А субд какая?
Для mysql этот запрос дико тяжёлый
Для mysql этот запрос дико тяжёлый
Да, mysql. Сам я шарю базы данных не так хорошо, чтобы знать такие важные детали - потому ориентируюсь скорее на чужие примеры и читабельность кода На работе часто приходится править код на Oracle - там сабселекты широко используют)
Sail пишет:
сравните с этим:
CODE (SQL):
скопировать код в буфер обмена
скопировать код в буфер обмена
- SELECT p.* FROM `products` p
- JOIN `products_properties` ppts ON ppts.product_id = p.`id` AND ppts.`property_id` IN (1, 4)
- JOIN `products_properties` ppts2 ON ppts2.product_id = p.`id` AND ppts2.`property_id` IN (2, 3, 6)
- JOIN `products_properties` ppts3 ON ppts3.product_id = p.`id` AND ppts3.`property_id` IN (5)
- GROUP BY p.`id`;
Хм, вот где-то так я написал изначально, только джойнил снова сабселекты зачем-то Так что потом всё переписал на то что приводил выше. Выглядит логично, спасибо.
Мелкий пишет:
Идентичный запрос и должен быть уже ощутимо легче, чтобы сразу в рантайме считаться:
CODE (SQL):
скопировать код в буфер обмена
скопировать код в буфер обмена
- SELECT p.*
- FROM products p
- JOIN (
- SELECT product_id,
- sum(property_id IN (1,4)) AS filter_0,
- sum(property_id IN (2,3,6)) AS filter_1,
- sum(property_id IN (5)) AS filter_3
- FROM products_properties
- WHERE property_id IN (1,2,3,4,5,6)
- GROUP BY produnct_id
- HAVING filter_0>0 AND filter_1>0 AND filter_2>0
- ) AS filters ON p.id=filters.product_id
Ну или такой вариант
Вот тоже изначально подумывал о чём-то подобном. но решил что всякие сабселекты\джойны быстрее групповых функций Выходит, был не прав
Мелкий пишет:
Sail пишет:
добавьте индекс (уникальный
Первичный сразу.
добавьте индекс (уникальный
Первичный сразу.
Индексы само собой, и по property_id, и по product_id для админки, и уникальный по паре property_id, product_id
А вот на счёт первичного я немного не понял - что property_id, что product_id, всё неуникальные записи для таблицы, нет какого-то готового поля, которое бы однозначно определяло запись.