2015-09-15 3 views
0

У меня есть таблица, созданный в EAV модели в MySQL моя самая большая проблема заключается в том, чтобы сделать фильтрацию данных, как веб-сайт электронной коммерции позвольте мне показать некоторые данные и то, что я действительно хочу, чтобы достичьКак осуществить фильтрацию данных в тузд модели EAV

у меня есть таблица с именем значение в этом у меня есть четыре колонки

id product_id Attribute_name Attribute Value 
1  1   Brand   Apple 
2  1   Model   Iphone6 
3  1   Color   White 
4  1   OS    ios 

5  2   Brand   Samsung 
6  2   Model   Note4 
7  2   Color   Black 
8  2   OS    Android 

9  2   Brand   SONY 
10 2   Model   Xperia 
11 2   Color   Red 
12 2   OS    Android 

и я хочу, чтобы создать все таблицы 4 фильтрации предположим, что кто-то проверяет яблоко и самсунг тогда только две модели должны появится Iphone6 ​​и Примечание4, а затем, когда пользователь чеки на Iphone6 ​​только белый цвет и ios в операционной системе появляется, как это сделать, пожалуйста, я хочу, чтобы решение было очень плохо в течение 2 дней AYS

+0

Хотели бы вы высказать больше информации о том, что ищете, поскольку я не знаю, работали ли вы до сих пор ответы или нет? – stanhope

ответ

0

Изменение структуры таблицы, так что Brand, Model, Color и OS атрибуты сделали бы жизнь легче, но при условии, что есть какая-то веская причина, почему вы не можете преобразовать его, я рекомендую вложенный запрос:

SELECT * FROM value WHERE product_id = (
    SELECT product_id 
    FROM value 
    WHERE Attribute_name = 'Brand' 
    AND Attribute_value = 'Apple' 
); 

Это вернет всю информацию, касающуюся продуктов Apple. Если вы хотите отфильтровать этот список, так что вы просто получите список моделей, добавить условия для внешнего запроса, например:

SELECT * FROM value WHERE product_id = (
    SELECT product_id 
    FROM value 
    WHERE Attribute_name = 'Brand' 
    AND Attribute_value = 'Apple' 
) 
AND Attribute_name = 'Model'; 

Там хороший анализ здесь плюсы и минусы EAV модели: https://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model#EAV_versus_row_modeling

Если вы хотите вывести несколько матчей, вы можете OR вместе вложенные запросы:

SELECT * FROM value WHERE product_id = (
    SELECT product_id 
    FROM value 
    WHERE Attribute_name = 'Brand' 
    AND Attribute_value = 'Apple' 
) OR product_id = (
    SELECT product_id 
    FROM value 
    WHERE Attribute_name = 'Brand' 
    AND Attribute_value = 'Samsung' 
) 
AND Attribute_name = 'Model'; 

Если вы хотите вывести несколько матчей на разных уровнях, вы можете держать вложенности стек:

SELECT * FROM value WHERE product_id = (
    SELECT product_id 
    FROM value 
    WHERE Attribute_name = 'Brand' 
    AND Attribute_value = 'Apple' 
) OR product_id = (
    SELECT product_id 
    FROM value 
    WHERE Attribute_name = 'Brand' 
    AND Attribute_value = 'Samsung' 
) 
AND Attribute_name = 'Model' 
AND (Attribute_value = 'iPhone' OR Attribute_value = 'S3'); 
+0

и что делать, если проверено более 1 значения, убедитесь, что пользователь проверил как samsung, так и apple, и после этого проверяет две модели note4 и iphone6, а затем выбирает ios os, а затем появляется флажок цвета, связанный со всем яблочным iphone6 ​​с ios os white color. Как сделать многоуровневую фильтрацию с помощью модели EAV. Надеюсь, вы понимаете мою проблему. Я хочу, чтобы такая же фильтрация, как веб-сайт электронной коммерции, но в модели EAV. –

+0

. Я понимаю, что вы хотите, чтобы она была как веб-сайт электронной коммерции, но несколько фасетных поисков (это функциональность, с которой вы ускользаете to) позволяют вам выбирать несколько граней на каждом уровне (например, Apple и Samsung, iPhone и S3). Обычно они работают, постепенно ограничивая ваш поиск, например. показать все продукты, затем отфильтровать Apple, показать продукты Apple и пересмотреть фильтры нисходящего потока, чтобы показывать только продукты Apple-продукта. – stanhope

+0

вы пытаетесь сказать, что когда пользователь нажимает на флажок бренда, мне нужно создавать параметры модели, и, кроме того, опция os - это то, что вы пытаетесь сказать –