Хитрое решение для запроса - PullRequest
1 голос
/ 23 октября 2009

Кто-нибудь знает, как можно создать запрос (или запросы) фильтрации продукта, который будет эмулировать результаты на этой странице?

http://www.emag.ro/notebook_laptop

Объяснение

Если вы нажмете HP как бренд, на странице будут показаны все продукты HP, а остальные доступные фильтры собраны из этого запроса. Прекрасно и модно до сих пор, я облажался без проблем.

Нажмите 4 ГБ ОЗУ, и, конечно, вы увидите все продукты HP, которые имеют это свойство / функцию. Снова отлично и денди, проблем нет, пока здесь.

НО, если вы присмотритесь, вы увидите, что функции бренда теперь также показывают, скажем, Acer, имея несколько продуктов с функцией 4 ГБ и, возможно, больше после Acer, а флажок еще не установлен.

Единственная идея, которая приходит на ум, - это сделать гораздо больше запросов к базе данных, чтобы получить эти другие возможности.

После того, как вы начнете проверять 3-й возможный вариант (скажем, размер экрана), все станет еще сложнее.

Наверное, мой вопрос: Кто-нибудь имеет представление о том, как сделать это без налогообложения сервера с тоннами запросов?

Большое спасибо за то, что прочитали это далеко, я надеюсь, что я прояснил себя во всей этой маленькой истории.

Ответы [ 3 ]

1 голос
/ 23 октября 2009

Взгляните на sql

UNION

синтаксис.

" UNION используется для объединения результатов нескольких операторов SELECT в один набор результатов."

0 голосов
/ 23 октября 2009

На самом деле это не «тонны» запросов, это один запрос на тип атрибута (бренд, RAM, HDD). Допустим, вы выбрали HP, 4 ГБ оперативной памяти и 250 ГБ диска. Теперь для каждого типа атрибута выберите продукты в соответствии с фильтром , за исключением для текущего типа, и сгруппируйте результаты по текущему типу. В упрощенной модели запросы могут выглядеть следующим образом:

SELECT brand, count(*) FROM products WHERE ram='4BG' AND disk='250GB' GROUP BY brand
SELECT ram, count(*) FROM products WHERE brand='HP' AND disk='250GB' GROUP BY ram
SELECT disk, count(*) FROM products WHERE brand='HP' AND ram='4BG' GROUP BY disk
SELECT cpu, count(*) FROM products WHERE brand='HP' AND ram='4BG' AND disk='250BG' GROUP BY cpu
...

У вас должны быть индексы для столбцов, чтобы каждый запрос не выполнял последовательное сканирование таблицы. Конечно, есть несколько «популярных» комбинаций, и вам, вероятно, придется отображать одни и те же числа на нескольких страницах, когда пользователь сортирует / перемещается по списку, поэтому вы можете захотеть кэшировать числа и сделать кеш недействительным при обновлении / вставке / удалении .

0 голосов
/ 23 октября 2009

Возможно, есть некоторые сложные средства определения некоторого вычисленного расстояния результата от ваших критериев, но, возможно, это так же просто, как использование в запросе ИЛИ, а не И.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...