판매자 웹 사이트에서 발견 한 SQL 버그를 개선하려고합니다.WHERE 절에서 SELECT를 피하십시오.
나는 두 개의 테이블이 있습니다
------ Table "products" ------
| id_product | product_name |
-----------------------------
| 1 | T-shirt |
| 2 | Trousers |
| 3 | Sweat-shirt |
| 4 | Socks |
----------- Table "features" -----------
| id_product | feature | feature_value |
----------------------------------------
| 1 | Color | Red |
| 1 | Size | M |
| 1 | Fabric | Cotton |
| 2 | Color | Blue |
| 2 | Size | S |
| 2 | Fabric | Polyester |
| 3 | Color | Red |
| 3 | Size | L |
| 3 | Fabric | Wool |
| 4 | Color | White |
| 4 | Size | L |
| 4 | Fabric | Cotton |
나는 다음과 같은 기능을 가진 제품을 검색하기 위해 노력하고있어 :
이- 중 하나를 빨간색 또는 파란색 크기가 M
- 입니다 색상은 어디 어디
- 직물이 면인 곳
SELECT p.id_product
FROM products p
WHERE p.id_product IN (SELECT f.id_product FROM features f WHERE f.feature_value IN ("Red", "Blue"))
AND p.id_product IN (SELECT f.id_product FROM features f WHERE f.feature_value = "M")
AND p.id_product IN (SELECT f.id_product FROM features f WHERE f.feature_value = "Cotton")
GROUP BY p.id_product
이
다중 SELECT에게 (물론, 현실에서, 내 테이블과 내 쿼리 난 그냥 문제가있는 부분에 초점을 맞추고있어, waaaay를보다 더 복잡) : 다음과 같이내 쿼리입니다 WHERE 절에서 8 개 이상의 기능을 선택하면 서버 전체가 느려집니다. WHERE 절에서 이와 같이 많은 쿼리를 작성하지 않는 방법이 있습니까?
편집 : 예를 들어, 여기에 실제 쿼리 중 하나입니다 :
SELECT p.id_product id_product
FROM ps_product p
INNER JOIN ps_category_product cp ON p.id_product = cp.id_product
INNER JOIN ps_category c ON (c.id_category = cp.id_category AND c.nleft >= 6 AND c.nright <= 7 AND c.active = 1)
LEFT JOIN ps_stock_available sa ON (sa.id_product = p.id_product AND sa.id_shop = 1)
INNER JOIN ps_product_shop product_shop ON (product_shop.id_product = p.id_product AND product_shop.id_shop = 1)
WHERE 1
AND product_shop.active = 1
AND product_shop.visibility IN ("both", "catalog")
AND p.id_manufacturer IN (5,4)
AND sa.quantity > 0
AND p.id_product IN (SELECT id_product FROM ps_feature_product fp WHERE fp.id_feature_value = 82)
AND p.id_product IN (SELECT id_product FROM ps_feature_product fp WHERE fp.id_feature_value = 37248)
AND p.id_product IN (SELECT id_product FROM ps_feature_product fp WHERE fp.id_feature_value = 181)
AND p.id_product IN (SELECT id_product FROM ps_feature_product fp WHERE fp.id_feature_value = 37821)
AND p.id_product IN (SELECT id_product FROM ps_feature_product fp WHERE fp.id_feature_value = 33907)
AND p.id_product IN (SELECT id_product FROM ps_feature_product fp WHERE fp.id_feature_value = 33902)
AND p.id_product IN (SELECT id_product FROM ps_feature_product fp WHERE fp.id_feature_value = 70)
AND p.id_product IN (SELECT id_product FROM ps_feature_product fp WHERE fp.id_feature_value = 76)
AND p.id_product IN (SELECT id_product FROM ps_feature_product fp WHERE fp.id_feature_value = 291)
AND p.id_product IN (SELECT id_product FROM ps_feature_product fp WHERE fp.id_feature_value = 75)
AND p.id_product IN (SELECT id_product FROM ps_feature_product fp WHERE fp.id_feature_value = 44459)
GROUP BY id_product
JOIN은 무엇이고 필터링은 어디에서 할 수 있습니까? – Pred
실제로 쿼리에는 많은 JOIN이 있습니다. 대신 WHERE 절만 편집하는 솔루션을 찾으려고합니다. – roberto06
그래서 많은 조인은 마지막 테이블에 가입하지 않기 때문에 ...? – Pred