변수를 통해 날짜 참조를 전달하는 하위 쿼리를 사용하여 계산 된 열을 필요로하는 쿼리를 수행하려고합니다. 나는 "올바르게"하지는 않지만 근본적으로 쿼리가 끝나지 않고 몇 분 동안 끝내야하는지 확신하지 못합니다. 이것은 내 쿼리입니다 :사용자 정의 변수를 사용하는 MySQL 하위 쿼리
select @groupdate:=date_format(order_date,'%Y-%m'), count(distinct customer_email) as num_cust,
(
select count(distinct cev.customer_email) as num_prev
from _pj_cust_email_view cev
inner join _pj_cust_email_view as prev_purch on (prev_purch.order_date < @groupdate) and (cev.customer_email=prev_purch.customer_email)
where cev.order_date > @groupdate
) as prev_cust_count
from _pj_cust_email_view
group by @groupdate;
하위 쿼리가 inner join
있는 유일한 날 이전 @groupdate
의 날짜에 구입 한 사람들의 수를 제공한다는 자체 조인 수행합니다. EXPLAIN
은 다음과 같습니다 :
+----+----------------------+---------------------+------+---------------+-----------+---------+---------------------------+--------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+----------------------+---------------------+------+---------------+-----------+---------+---------------------------+--------+---------------------------------+
| 1 | PRIMARY | _pj_cust_email_view | ALL | NULL | NULL | NULL | NULL | 140147 | Using temporary; Using filesort |
| 2 | UNCACHEABLE SUBQUERY | cev | ALL | IDX_EMAIL | NULL | NULL | NULL | 140147 | Using where |
| 2 | UNCACHEABLE SUBQUERY | prev_purch | ref | IDX_EMAIL | IDX_EMAIL | 768 | cart_A.cev.customer_email | 1 | Using where |
+----+----------------------+---------------------+------+---------------+-----------+---------+---------------------------+--------+---------------------------------+
그리고 테이블 _pj_cust_email_view
의 구조
'_pj_cust_email_view', 'CREATE TABLE `_pj_cust_email_view` (
`order_date` varchar(10) CHARACTER SET utf8 DEFAULT NULL,
`customer_email` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
KEY `IDX_EMAIL` (`customer_email`),
KEY `IDX_ORDERDATE` (`order_date`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1'
또, 앞서 말했듯이, 나는 이것이 가장 좋은 방법입니다 정말 모르겠어요 이것을 성취하십시오. 어떤 비판, 방향을 주셔서 감사합니다!
업데이트
좀 진전을했으며, 지금은 절차 적으로 대신 데이터베이스 개월의 모든 알려진 개월을 반복하고 시간 앞서 바르를 설정하여 위를하고 있어요. 나는 아직도 이것을 좋아하지 않는다.
정의 사용자가
set @startdate:='2010-08', @enddate:='2010-09';
가 지정된 범위
select count(distinct customer_email) as num_cust
from _pj_cust_email_view
where order_date between @startdate and @enddate;
에 총 별개의 이메일을 가져옵니다 바르의 총 수를 가져옵니다 설정 : 이것은 내가 지금 가지고 무엇을 주어진 범위보다 먼저 구매 한 고객
select count(distinct cev.customer_email) as num_prev
from _pj_cust_email_view cev
inner join _pj_cust_email_view as prev_purch on (prev_purch.order_date < @startdate) and (cev.customer_email=prev_purch.customer_email)
where cev.order_date between @startdate and @enddate;
여기서 @startdate
은 월의 시작으로 설정되고 @enddate
은 해당 월의 끝을 나타냅니다.
나는 정말 이것이 하나의 전체 쿼리에서 수행 될 수 있다고 생각합니다.
참조 업데이트를 위 ... 날짜 기준으로는 적격 날짜를 만들 수있는 다음 레코드주기에 할당받을 않습니다 찾고있는 것을 반환하는 현재 솔루션에 대해서는 반복적으로 하나의 전체 쿼리에 포함시키고 싶습니다. – philwinkle
일부 샘플 입력 데이터와 일부 예상 출력을 제공하면 도움이됩니다. – Thomas