제품에 대한 단일 주문을 찾아하는 다음과 같은 구조 line_items :효율적인 쿼리 내가 두 테이블 주문이
-
: 나는 다음과 같은 요구 사항을 해결하는 가장 효율적인 방법을 찾기 위해 노력하고
Orders (id = PK, indexes on user_id)
-------------------------------------
id user_id
== ======
1 1
2 2
3 1
4 3
5 1
LineItems (id = PK, indexes on order_id and product_id)
id order_id product_id quantity
== ====== ======== ======
1 1 1 1
2 1 2 2
3 2 1 4
4 2 3 6
5 3 1 1
6 4 1 1
7 5 1 1
을
user
및 product
이 주어진 경우 에 속하는 LineItems
이 있으며 지정된 제품은 주문한 유일한 제품입니다. 예컨대 : USER_ID가 1이고 PRODUCT_ID이 1이면 쿼리가 반환해야합니다 개별 항목 5, 7
는 user
감안할 때 주어진 제품은 주문 유일한 제품이 어디 product
는 Orders
찾을 수 있습니다. 예컨대 : USER_ID가 1이고 PRODUCT_ID이 1이면 쿼리가 반환해야합니다 주문 3, 5
주문 및 LineItems 표는 수백만 개의 행을 가질 수 있습니다.
나는 COUNT
과 HAVING
을 사용하는 실제 해결책이 있습니다. 이것이 가장 효율적인 해결책이라고 확신하지 못합니다.
특히 에 설명 된 기술을 사용하여이 문제를 해결할 수 있는지 궁금합니다. this answer에 있습니다.
참고 : 시나리오를 설명하기 위해 Orders 및 LineItems 테이블을 사용하고 있습니다. 내 실제 테이블은 매우 다르다 그것은
편집 2
이 쿼리는 GROUP BY
및 HAVING
를 사용하는 것보다 효율적인가요 등 주문과 관련이없는? 당신이 다음은 "유사 제품"미리 계산 될 수있는 더 나은 것 정말 거대한 프로젝트 및 데이터의 정말 엄청난 금액을 가지고 있고, 일부 스케줄러 (하루에 한 번, 시간, 주 단위로 갱신하는 경우
SELECT A.id
FROM LineItems A
JOIN Orders B ON B.id = A.order_id AND B.user_id = 1
LEFT OUTER JOIN LineItems C ON C.order_id = A.order_id AND
C.product_id != A.product_id
WHERE A.product_id = 1 AND C.id IS NULL
'HAVING COUNT (...)'에 대한 교과서 같은 소리 – Phil
나는 HAVING 및 COUNT를 기반으로하는 해결책을 가지고 있습니다. 가장 효율적인 솔루션인지 확실하지 않습니다. –
나는 현재 접근법이 합리적이라고 말하고있다. (zerkms 응답의 고려 사항 참조) – Phil