2014-10-04 7 views
1

У меня есть таблицы:mysql | Поиск Facet расширенный

CREATE TABLE IF NOT EXISTS `category` (
    `id` int(11) NOT NULL, 
    `name` varchar(255) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

INSERT INTO `category` (`id`, `name`) VALUES 
(1, 'Computers'), 
(2, 'Bikes'); 

CREATE TABLE IF NOT EXISTS `fields` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `field_name` varchar(255) DEFAULT NULL, 
    `cid` text NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ; 

INSERT INTO `fields` (`id`, `field_name`, `cid`) VALUES 
(1, 'Processor', '1'), 
(2, 'Display', '1'), 
(3, 'Brand', '2'); 

CREATE TABLE IF NOT EXISTS `fields_values` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `field_id` int(11) DEFAULT NULL, 
    `field_value` varchar(255) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ; 

INSERT INTO `fields_values` (`id`, `field_id`, `field_value`) VALUES 
(1, 1, 'Intel Pentium 3'), 
(2, 2, '27 inch'), 
(3, 3, 'BMX'), 
(4, 1, 'AMD Radeon'), 
(5, 1, 'Intel Atom'), 
(6, 2, '22 inch'); 

CREATE TABLE IF NOT EXISTS `products` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) NOT NULL, 
    `cid` text NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ; 

INSERT INTO `products` (`id`, `name`, `cid`) VALUES 
(1, 'Computer1', 1), 
(2, 'Bike1.BMX', 2), 
(3, 'Bike3', 2), 
(4, 'Intel Atom', 1), 
(5, 'Computer Radeon', 1); 

CREATE TABLE IF NOT EXISTS `products_to_fields_values` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `product_id` int(11) DEFAULT NULL, 
    `field_value_id` int(11) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ; 

INSERT INTO `products_to_fields_values` (`id`, `product_id`, `field_value_id`) VALUES 
(1, 1, 1), 
(2, 2, 3), 
(3, 1, 2), 
(4, 4, 5); 

Мой запрос выглядит следующим образом:

SELECT ft.id field_id, ft.field_name, fvt.field_value, fvt.id field_value_id, COUNT(DISTINCT pid) count 
FROM FIELDS ft 
JOIN fields_values fvt ON (ft.id = fvt.field_id) 
JOIN products_to_fields_values pfv ON (pfv.field_value_id = fvt.id) 
JOIN products pt ON (pt.id = pfv.product_id) 
LEFT JOIN (

SELECT ft.id field_id, ft.field_name, fvt.field_value, fvt.id field_value_id, pt.name, pt.id pid 
FROM FIELDS ft 
JOIN fields_values fvt ON (ft.id = fvt.field_id) 
JOIN products_to_fields_values pfv ON (pfv.field_value_id = fvt.id) 
JOIN products pt ON (pt.id = pfv.product_id) 
GROUP BY pt.id 
)LJ ON pfv.product_id = LJ.pid 
WHERE FIND_IN_SET(1, pt.cid) 
GROUP BY ft.field_name, fvt.field_value 
LIMIT 0 , 30 

Этот запрос будет возвращать (я пытаюсь построить многогранный фильтр):

field_id field_name field_value field_value_id count 
2  Display 27 inch  2    1 
1  Processor Intel Atom 5    1 
1  Processor Intel Pentium 3   1 

Но у меня есть другие значения в этой таблице: fields_values ​​: AMD Radeon и 22 дюйма. Где моя ошибка в запросе? Спасибо!

EDIT:

Я ожидаю, чтобы получить результат:

field_id field_name field_value field_value_id count 
2   Display  22 inch  6    0 
2   Display  27 inch  2    1 
1   Processor AMD Radeon 4    0 
1   Processor Intel Atom 5    1 
1   Processor IntelPentium3 1    1 

Где отсчет значение подсчета продукции.

+0

Пожалуйста, дайте мне дать в краткой, что результат/вывода вы хотите из этих таблиц, поэтому я могу попытаться построить свой собственный запрос для вас, спасибо. – chanchal

+0

Готово. Проверьте мое редактирование выше. – user889349

+0

Я строю запрос, и я получил данные, что вы хотите, но не ясно, о столбце count, из которых вы хотите подсчитать поле! – chanchal

ответ

0

Вот работа SQL, но я не уверен, что вы правильно построили свою структуру.

SELECT 
    ft.id field_id, ft.field_name, fvt.field_value, fvt.id as field_value_id, COUNT(DISTINCT pid) count 
FROM products AS pt 
JOIN products_to_fields_values AS pfv ON pfv.product_id = pt.id 
JOIN fields_values AS fvt ON fvt.field_id = pfv.field_value_id 
JOIN fields AS ft on ft.id = fvt.field_id 
LEFT JOIN (

SELECT ft.id field_id, ft.field_name, fvt.field_value, fvt.id field_value_id, pt.name, pt.id pid 
FROM fields ft 
JOIN fields_values fvt ON (ft.id = fvt.field_id) 
JOIN products_to_fields_values pfv ON (pfv.field_value_id = fvt.id) 
JOIN products pt ON (pt.id = pfv.product_id) 
GROUP BY pt.id 
)LJ ON pfv.product_id = LJ.pid 

WHERE FIND_IN_SET(1, pt.cid) 
GROUP BY ft.field_name, fvt.field_value 
LIMIT 0 , 30 

Короче - и есть ошибка в этой строке:

JOIN products_to_fields_values pfv ON (pfv.field_value_id = fvt.id) 

право один:

JOIN products_to_fields_values pfv ON (pfv.field_value_id = fvt.field_id) 
+0

Спасибо, но у меня нет product_id = 5 и field_value_id = 4 в этой таблице: products_to_fields_values! Ваш запрос возвращает «AMD Radeon» со счетом 1 (должно быть 0). – user889349

0

Я попробовал на свой вопрос, проверьте этот запрос

select fValue.field_id, f.field_name as field_name, fValue.field_value, fValue.id as field_value_id 
from products_to_fields_values as productValue 
left join fields_values as fValue on(fValue.field_id=productValue.field_value_id) 
left join fields as f on (fValue.field_id=f.id) 
left join products as p on (productValue.product_id=p.id) 
where p.cid=1 
+0

@ user889349 проверить этот запрос, я также попытаюсь получить счет. – chanchal

0

Я совершенно уверен, что проблема, то есть «недостающие» записи, вызвано командами «group by». Немного сложно найти решение для вас, поскольку я не слишком уверен, чего вы пытаетесь достичь. Ожидаемый результат, который вы опубликовали, не помог мне в этом отношении. Запрос, который вы пытаетесь запустить, довольно сложный, и в заполненной базе данных начнет работать очень, очень медленно. Как таковой, это предполагает, что требуется лучший дизайн базы данных. Если вы сможете объяснить, что вы пытаетесь достичь, я с удовольствием рассмотрю решение для вас.

0

Игнорирование предела и где положения этого запроса вам нужно использовать:

SELECT 
    fields.id AS field_id 
, fields.field_name 
, fields_values.field_value 
, fields_values.id AS field_value_id 
, COUNT(products.id) AS `count` 
FROM fields_values 
JOIN fields ON fields.id = fields_values.field_id 
JOIN category AS field_category ON field_category.id = fields.cid 
LEFT JOIN products_to_fields_values AS product_fields ON fields_values.id = product_fields.field_value_id 
LEFT JOIN products ON products.id = product_fields.product_id 
GROUP BY 1, 2, 3, 4; 

Это приводит к следующему результату:

| field_id | field_name | field_value  | field_value_id | count | 
+----------+------------+-----------------+----------------+-------+ 
|  1 | Processor | AMD Radeon  |    4 |  0 | 
|  1 | Processor | Intel Atom  |    5 |  1 | 
|  1 | Processor | Intel Pentium 3 |    1 |  1 | 
|  2 | Display | 22 inch   |    6 |  0 | 
|  2 | Display | 27 inch   |    2 |  1 | 
|  3 | Brand  | BMX    |    3 |  1 | 

В вашей where clause вы можете указать

WHERE category.id IN (1) 

, чтобы получить нужный результат.

Ошибкой вы делали (и предыдущий ответ, а) в том, что вы присоединялись категорию через продукт дает вам PRODUCT_CATEGORY вместо field_category.

Когда вы применили где условие на PRODUCT_CATEGORY, он удалил все продукты не являются частью набора, так что вы никогда не получите счет = 0

Смежные вопросы