X 일 동안 주문하지 않은 고객을 찾기 위해이 SQL을 만들었습니다.SQL 최적화 : x 일 동안 주문하지 않은 고객
결과 집합이 반환되므로이 게시물은 주로 두 번째 의견을 제시하고 최적화가 가능합니다.
SELECT o.order_id,
o.order_status,
o.order_created,
o.user_id,
i.identity_firstname,
i.identity_email,
(SELECT COUNT(*)
FROM orders o2
WHERE o2.user_id=o.user_id
AND o2.order_status=1) AS order_count,
(SELECT o4.order_created
FROM orders o4
WHERE o4.user_id=o.user_id
AND o4.order_status=1
ORDER BY o4.order_created DESC LIMIT 1) AS last_order
FROM orders o
INNER JOIN user_identities ui ON o.user_id=ui.user_id
INNER JOIN identities i ON ui.identity_id=i.identity_id
AND i.identity_email!=''
INNER JOIN subscribers s ON i.identity_id=s.identity_id
AND s.subscriber_status=1
AND s.subsriber_type=e
AND s.subscription_id=1
WHERE DATE(o.order_created) = "2013-12-14"
AND o.order_status=1
AND o.user_id NOT IN
(SELECT o3.user_id
FROM orders o3
WHERE o3.user_id=o.user_id
AND o3.order_status=1
AND DATE(o3.order_created) > "2013-12-14")
이 SQL의 잠재적 인 문제점을 발견 할 수 있습니까? 날짜가 동적으로 삽입됩니다.
프로덕션 환경에 넣은 최종 SQL에는 기본적으로 o.order_id, i.identity_id 및 o.order_count 만 포함됩니다.이 order_count는 정확해야합니다. 다른 선택된 필드와 'last_order'하위 쿼리는 포함되지 않으며 테스트 용으로 만 사용됩니다.
이것은 특정 날짜에 마지막으로 주문한 사용자의 목록을 제공하며 뉴스 레터 구독자입니다. 나는 WHERE 절의 NOT IN 부분과 order_count 부질의 정확성에 대해 의심 스럽다.
>이 SQL의 잠재적 인 문제점을 발견 할 수 있습니까? 어쩌면, 개인적으로는 내가 원하는 DDL (그리고/또는 sqlfiddle)과 함께 원하는 것을 가지고 처음부터 시작하는 것을 선호 할 것입니다. – Strawberry