2014-10-04 8 views
1
나는 테이블이

:mysql | 패싯 검색 고급

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 인치. 요청에 실수가 어디 있습니까? 감사합니다.

편집 :

가 난 점점 결과에 기대 :

수가있다
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

나는 쿼리를 빌드하고 원하는 필드 카운트에 대해 원하는 개수의 열에 대해 명확하지 않은 데이터를 얻었습니다. – 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 

- u는이 라인에 오류가 있습니다 : 나는 당신의 질문에 대한 노력

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! 귀하의 질의는 카운트 1 ("0"이어야 함)을 가진 "AMD Radeon"을 반환합니다. – 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

을 확인하십시오 올바른

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

나는 그 문제, 즉 '실종'기록을 확실히 확신한다. 'group by'명령으로 인해 발생합니다. 내가 당신이 성취하려는 것을 너무 확신하지 못해서 당신을위한 해결책을 생각해내는 것은 약간 어렵습니다. 당신이 게시 한 예상 결과는이 점에 관해서별로 도움이되지 못했습니다. 실행할 쿼리는 다소 복잡하며, 채워진 데이터베이스는 매우 느리게 실행되기 시작합니다. 따라서 더 나은 데이터베이스 설계가 요구됩니다. 달성하려는 것을 설명 할 수 있다면 기꺼이 해결책을 찾을 것입니다.

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; 

이 다음과 같은 결과가 생성 :

0

절을 제한을 무시하고있는 곳은 사용하는 데 필요한 쿼리 당신의 where clause 지정할 수에서

| 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 category.id IN (1) 

원하는 결과를 얻으십시오.

당신이 만들고 있었다 실수 (뿐만 아니라 이전의 대답은) 당신이 field_category 대신 당신에게 PRODUCT_CATEGORY을주는 제품을 통해 범주에 가입 한 것이 었습니다.당신이 PRODUCT_CATEGORY에 WHERE 조건을 적용

, 그것은 세트의 일부가 아닌 모든 제품을 제거, 그래서 당신은 수를 얻을하지 않을 것 = 0