Максим Тимофеев: это в описании "Множественное объединение multi join". Там же даже цитата "Просто перечислить условия вариантов в подзапросе/джоине через OR/AND не сработает, ". Так что я серьёзно. Это вообще мой первый заход на Тостер, потому что всегда упорно гуглю и ищу решения, но здесь действительно всё оказалось очень заковыристо.
Максим Тимофеев: >list_item_id лишнее зачем?
Значения выбираются из списков. Поэтому вместо value там id выбранного значения. Что в этом неправильного?
>Вы что-то курите?
Нет. Погуглите проблему фасетного EAV поиска. Все, кто с ней сталкивался, что-то курят.
Продолжаю свой блог XD
Нашел интересный способ - "развернуть" таблицу в плоскую. buysql.com/mysql/14-how-to-automate-pivot-tables.html
Тогда у одной записи будут доступны сразу все занчения. Но это нужен фоновый процесс, который будет обновлять такую вспомогательную таблицу
Мой мозг выдал пока только одну концепцию - использовать вложенные запросы для того, чтобы каждый раз выбирать значения по одному свойству из предыдущего запроса. Сначала выбрать желтые, либо зеленые товары, а потом ИЗ НИХ выбрать прямоугольные. Другое дело, что не очень получается составить такой запрос даже просто на бумаге, а через ActiveQuery возможно нельзя вовсе (а хотелось бы именно через ActiveQuery). Но это хотя бы концепция, которую мой разум породил :)
Хоть в исходнии битрикса лезь... там же есть такое.
Максим Тимофеев: Так вот, и выходит следующее:
допустим я говорю, что цвет должен быть или красный или желтый - это срабатывает, потому что есть свойство color, у которого есть или одно или оба значения. Но если у того же товара должно быть ещё и свойство shape с некоторым значением и притом должн быть обязательно - происходит отказ.
Максим Тимофеев:
таблица со значениями свйоств такая (products_parameters):
id - ключ,
parameter_id - айдишник свойства,
product_id - айдишник товара,
list_item_id - айдишник значения из списка. (там в поле slug и есть эти green, yellow, red и так далее).
И я думаю, что AND не работает потому, что связь-то много ко многим, но у каждой записи из этой таблицы всегда есть только один параметр и только один айдишник. Поэтому ИЛИ проходит, так как у записи с красным цветом при фильтре "красный или желтый" совпадение будет. А вот "красный И желтый", при том, что там только красный...
И это несмотря на то, что у свойства есть несколько элементов products_parameters, и у них сумарно есть все искомые значения свойств
Максим Тимофеев:
В итоге то же самое и получилось
lists_items - это список возможных значений свойств (из них формируются списки, которыми заполняются свойства)
parameters - это сами свойства
Вот здесь и условие: если код значения свойства biglist и код свойства list-side И если код значения свойства 'black' или 'green' и код свойства tea-type. При замене И на ИЛИ работает корректно. Однако с И всегда возвращает пустую выборку.
WHERE (`sub_sections`.`slug`='first_sub')
AND (((`lists_items`.`slug`='biglist') AND (`parameters`.`slug`='list-size'))
AND ((`lists_items`.`slug` IN ('black', 'green')) AND (`parameters`.`slug`='tea-type')))
Максим Тимофеев: я же говорю "ИЛИ работает". Надо И. Есть связь много ко многим между атрибутами и их значениями из списка. И выбрать запись, у которой есть значение красного ИЛИ желтого цвета - легко. Сложно - выбрать ту, с которой связана запись И красного И желтого цвета.
Максим Тимофеев: я сначала тоже так думал. Но это работает с OR, а мне нужно AND - о чем я и написал. А AND вернет пустую выдачу, потому что у одной записи а таблице значений свойств только одно значение. То есть когда дана строка значение:красный, свойство:цвет, то она отдастся если я скажу красный или желтый. Но если я напишу AND, то он не отдастся, потмоу что в каждой строке значение только одно.
По связям я получаю несколько записей значений для всех атрибутов, но я не могу найти способ, чтобы вернуть только те записи, с которой связана запись с заданным красным цветом И прямоугольной формой. ИЛИ - пожалуйста, но И не выходит. Нужен другой подход. Увы мне и дедлайн мне Т_Т
Ну, простите, понятно, что я использую поисковую модель. К тому же я не так мало понимаю в yii, как Вам могло показаться и проблема глубже и серьёзнее.
Я долго думал как объяснить суть задачи и понял, что ответ вообще знают не многие к моему удивлению (мне казалось, что MySQL для таких задач подходит). Но вот суть проблемы.
Итак, есть EAV. Есть свойство. Одно, два.. три... у свойств есть значения. У каждого несколько. Выбрать какое-либо можно в фильтре. Результат должен быть как, к примеру, на сайте м-видео: если выбрано несколько значений свойства одного параметра - то результирующий товар должен иметь хотя бы одно из выбранных значений для каждого свойства. Например выбран цвет красный и желтый - в выдаче будут только красные или желтые товары. Но если при этом выбрана форма "прямоугольная", то у товаров обязательно должен быть красный или желтый цвет и обязательно прямоугольная форма.
Вопрос не в том в каком месте это пишется, не нарушается ли MVC-паттерн и приятен ли этот код вообще. Вопрос в составлении запроса. И как я понял, на MySQL это как-то делают, но решения выходят очень тяжлыми. Но мне хотя бы одно из них узнать :(
Максим Федоров: Есть свойства товаров, есть разделы, есть сами товары, есть возможные значения свойств товаров.
Товары связаны с разделами по id раздела
Свойства тоже связаны с разделами по id раздела и по этому же полю с товарами (когда общий раздел)
Для связи между возможными значениями свойств товара и товаром есть талица, где указывается id товара, id свойства, id возможного значения.
Передается массив, где ключи - это свойства товаров, а значения - это идентификторы возможных значений этог свойства.
Необходимо вернуть товары, у которых имеется хотя бы одно совпадение значения по КАЖДОМУ свойству. То есть если например у чая в фильтре задано свойство "размер листа" со значением "курпный", а свойство "тип" - зеленый, черный, то должен вернуться обязательно крупнолистовой чай, но или зеленый или черный.
У меня получается ИЛИ зеленый, или черный ИЛИ крупнолистовой. Если заменяю на И крупнолистовой - пустой ответ, хотя судя по даным такого быть не может.
Написано
Войдите на сайт
Чтобы задать вопрос и получить на него квалифицированный ответ.