2012-02-18 3 views
2

누군가가 나를 도울 수 있거나 적어도 올바른 방향으로 나를 가리킬 수 있기를 바랍니다. 저는 제품 사이트에서 일하고 있습니다. 방문자들이 www.asos.com과 비슷한 제품 결과 측면의 메뉴를 사용하여 결과를 필터링 할 수 있습니다. 기본적으로 제품 유형, 스타일, 가격, 적합성 ... 등을 선택할 수 있습니다. 이러한 각 맞춤 유형에는 자체 테이블과 각 값을 제품 테이블에 연결하는 참조 테이블이 있습니다. EG는 다음 필드, colour_id를, 이름 의 Productkey와 Colourref 테이블과, 내가 MySQL과 PHP를 사용하고 colour_id를테이블의 동일한 필드에 대한 다중 쿼리

의 Productkey 및 기타 모든 제품 정보 색상 테이블이있는

제품 테이블이있다. 방문자가 각 필터 유형 중 하나를 선택하고 각 속성의 개수를 표시하는 경우 데이터베이스를 쿼리하고 데이터를 표시하는 방법을 알고 있지만 여러 선택을 한 다음 계산할 수있게하고 싶습니다. 선택된 항목을 기반으로 각 속성의 개수입니다. 이 작업을 수행하는 방법에 대해 살펴 보았습니다. 서브 쿼리가 옵션으로 사용되는 것을 보았습니다. 그러나 9 개의 필터 그룹을 가지고 있는데 필요한 서브 쿼리의 수에 대해 우려하고 있습니다. 값. 현재 데이터베이스에 1/2 백만 개의 제품이 있으며 시간이 지남에 따라 커집니다. 그래서 예를 들어

페이지 = 1 개 &보기 = 20 & 제품 = 125,137,147 & 유형 = 1,3,5 & 색상 = 3,9,5과 같이 URL을 통해 조회 할 필요가있는 값을 캡처하고있어 & 재질 = 187,345

예에서 알 수 있듯이 매번 여러 값을 가질 수 있습니다. AND를 사용하여 쿼리를 작성하려고했습니다. 예 : 제품 = 125 AND 제품 = 137이지만 작동하지 않습니다.

올바른 방향으로 가리키는 사람이라도 누구나 최선의 방법에 대해 조언 해 줄 수 있습니까? 어떤 도움을 크게

을 이해할 수있을 것이다

가 사전에 감사

비비안 기본적으로

답변

2

당신은 이미 자신의 질문에 대답

SELECT ... 
FROM ... 
WHERE (product = 125 OR product = 137) AND 
     (colour = 3 OR colour = 8 OR colour = 5) ... 

당신은 OR 대신 AND를 사용할 필요가 여러 제품, 색상 등을 선택하려는 경우 제품과 색상이 모두 필요한 경우 AND을 사이에 사용하여 조합해야합니다. 하위 쿼리는 필요 없습니다.

SELECT ... 
FROM ... 
WHERE product IN (125, 137, 147) AND colour IN (3, 5, 8) 

이 SQL 코드의 더 완전한 예 :


그래도 IN를 사용하는 것이 더 쉽습니다

SELECT p.* 
FROM Products p 

LEFT JOIN Colourref cr 
ON cr.productkey = p.productkey 

LEFT JOIN Colours c 
ON c.Colour_ID = cr.Colour_ID 

WHERE 
    p.productkey IN (1, 2, 4) 
    AND c.Colour_ID IN (1, 2) 

이것은 ID가있는 모든 제품을 선택합니다 (1) , 2 또는 4의 색상 1 또는 2가 있습니다.

왼쪽에서 ID에 필요한 테이블을 조인 한 다음 원하는 값을 필터링합니다.

+0

안녕하세요, 그리스도, 제가 이미 그 답을 알고 있었고 제 질문을 삭제하려하고있었습니다. 나는 IN 대신에 어떤 이유 때문에 AND를 사용하려고 생각하고있었습니다. 도와 주셔서 정말 감사합니다. – Amara

+0

다른 질문이 있는데, 괜찮 으면. 나는 쿼리에서 IN을 사용할 때 MySQL이 컬럼에 설정 한 인덱스를 사용하지 않는다는 것을 알아 차렸다. 그러면 색인을 제거해야합니까? 옵티마이 저가 전체 테이블 스캔 속도가 빠르기 때문에 보통 인덱스를 사용하지 않기로 결정한 경우 다시 – Amara

+0

@ user1147635를 보내 주셔서 감사합니다. 모든 ID 열에 인덱스가 있습니까? 테이블에서 'ANALYZE TABLE

'을 실행하고 다시 시도하십시오. 인덱스를 사용하지 않는다고 어떻게 말합니까? 그러나 어쨌든 그들을 제거하지 마십시오. 그들은 여전히 ​​다른 쿼리에 유용 할 수 있습니다. – Chris

관련 문제