2010-02-24 4 views
1

Gday 전체,왜 MySQL은 실제로 서로 다른 두 가지 쿼리에서 데이터를 출력합니까?

특정 기간 동안 최초 고객의 거래 내역에 대한 세부 정보를 얻으려고합니다. 데이터의 나머지는 내가 기대하지 그러나

SELECT MIN(t.transaction_date_start), t.* 
FROM transactions t 
WHERE t.customer_id IN (1,2,3) 
AND t.transaction_date_finished >= '2010-02-01 00:00:00' 
AND t.transaction_date_finished <= '2010-02-28 23:59:59' 
GROUP BY t.customer_id 

위의 SQL이 제대로 최소 거래 날짜를 출력합니다

는 다음과 같은 고려하십시오.

최소 그룹화되지 않은 고객 ID의 데이터로 채워집니다.

왜 MySQL이 실제로 서로 다른 두 가지 쿼리에서 데이터를 출력합니까?

첫 번째 트랜잭션에 대한 모든 세부 사항을 선택하도록 SQL을 수정하려면 어떻게합니까?

건배,

마이클

답변

1

에 오신 것을 환영합니다 GROUP에서 MySQL의의 "숨겨진 열"을 "기능"에 의해 - 그것은 documented here입니다. (

SELECT MIN(t.transaction_date_start), -- (a) Wrapped in an aggregate function 
     t.*        -- (b) These are not 
    FROM transactions t 
WHERE ... 
GROUP BY t.customer_id     -- (c) Only customer_id - refer to (b) 

이 행을 얻으려면 : 표준 SQL은 SELECT 절에 집계 함수 (MIN, MAX, COUNT 등)에 싸여되지 않은 열을 포함하지 않는 GROUP BY 절을 정의 할 수 없습니다 들) 최소 날짜를 일치, 사용 : 첫 번째 문은 늘 모든 고객의 분으로 특정 고객에 대한 분을 선택

SELECT t.* 
    FROM TRANSACTIONS t 
    JOIN (SELECT ta.customer_id, 
       MIN(ta.transaction_date_start) AS min_date 
      FROM TRANSACTIONS ta 
     WHERE ta.transaction_date_finished BETWEEN '2010-02-28 23:59:59' AND '2010-02-01 00:00:00' 
     GROUP BY ta.customer_id) x ON x.customer_id = t.customer_id 
           AND x.min_date = t.transaction_date_start 
WHERE t.customer_id IN (1, 2, 3) 
+0

여러 고객 (위의 내 업데이트에 따라 customer_id IN (1,2,3) 사용)에 대해 분을 얻으려고한다고해도이 기능이 계속 작동합니까? – Michael

+0

WHERE t.customer_id IN (1,2,3)은 여러 개의 client_id에 대해 작동합니다. – Michael

0

대신 그룹을 사용하여 주문할 수 있습니다 나는 내에서 특정 고객에 대한 최초의 거래의 세부 사항을 얻기 위해 노력하고

select * from transactions where customer_id = 1 and 
    transaction_date_finished between '2010-02-01 00:00:00' and '2010-02-28 23:59:59' 
    order by transaction_date_finished limit 1 
1

일정 기간. 여기

당신은 이동 :

SELECT TOP 1 * 
FROM transactions t 
WHERE t.customer_id = 1 
AND t.transaction_date_finished >= '2010-02-01 00:00:00' 
AND t.transaction_date_finished <= '2010-02-28 23:59:59' 
ORDER BY t.transaction_date_start 
+0

고객 1. 최소 일치하지 않을 수는 일 소스는 바깥 나는 분을 얻고 싶었다 위의 내 업데이트에 따라 여러 고객 (IN (1,2,3)) 문제가 발생합니다. – Michael

+0

@Michael : 처음에는 두 번째 select 절에 추가 할 수 있었지만 두 번째 버전은 더 좋았으므로 두 번째 select 절만 유지했습니다. –

관련 문제