2014-01-21 10 views
2

내가 SQL 테이블에 일부 항목의 판매 데이터를 포함하고있는 첫 번째 또는 마지막 행을 선택합니다. 사실, 상품 판매 기록이 있습니다.MySQL은 : 여러 열을 기준으로 그룹화 할 때

예를 들어 키보드 (id:1)와 마우스 (id:2)의 두 항목이 포함 된 판매가 있습니다. 구매자는 eBay처럼 각 항목과 여러 번 입찰을 할 수 있습니다. 따라서 2 명의 구매자 (ids are 97 and 98)가 입찰을 몇 번했다고 가정 해 봅시다. 관련 데이터는 다음과 같습니다.

bid_id | buyer_id | item_id | amount  | time    | 
1  | 97   | 1  | 44.26  | 2014-01-20 15:53:16 | 
2  | 98   | 2  | 30.47  | 2014-01-20 15:54:52 | 
3  | 97   | 2  | 40.05  | 2014-01-20 15:57:47 | 
4  | 97   | 1  | 42.46  | 2014-01-20 15:58:36 | 
5  | 97   | 1  | 39.99  | 2014-01-20 16:01:13 | 
6  | 97   | 2  | 24.68  | 2014-01-20 16:05:35 | 
7  | 98   | 2  | 28   | 2014-01-20 16:08:42 | 
8  | 98   | 2  | 26.75  | 2014-01-20 16:13:23 | 

이 표에서 각 사용자에 대한 첫 번째 항목 제공 정보 및 각 사용자에 대한 마지막 제공 정보에 대한 데이터를 선택해야합니다.

bid_id | buyer_id | item_id | amount  | time    | 
5  | 97   | 1  | 39.99  | 2014-01-20 16:01:13 | 
6  | 97   | 2  | 24.68  | 2014-01-20 16:05:35 | 
8  | 98   | 2  | 26.75  | 2014-01-20 16:13:23 | 
: I는 각 사용자에 대한 마지막 제안을 선택하면

bid_id | buyer_id | item_id | amount  | time    | 
1  | 97   | 1  | 44.26  | 2014-01-20 15:53:16 | 
2  | 98   | 2  | 30.47  | 2014-01-20 15:54:52 | 
3  | 97   | 2  | 40.05  | 2014-01-20 15:57:47 | 

는, 반환 같이해야한다 : 내가 선택하는 경우

그래서 첫 번째 항목은 같은 데이터가 있어야한다 반환 (별개의) 각 사용자에 대한 제공 나는 각 사용자에 대해 각 항목을 가지고 가지고 있기 때문에

, 나는 다음 buyer_iditem_id 모두 GROUP BY에 노력 SELECTtime 또는 bid_idMIN 값. 그러나 그것은 항상 나를 먼저 돌아 bid_id하지만 (실제로 마지막 이벤트입니다) 최신 amount 행.

여기에 내가 시도 쿼리의 :

SELECT MIN(`bid_id`) AS `bid_id`,`buyer_id`,`item_id`,`amount`,`time` FROM `offers` GROUP BY `buyer_id`,`item_id` 

는 그리고 결과였다

bid_id | buyer_id | item_id | amount  | time    | 
1  | 97   | 1  | 39.99  | 2014-01-20 16:01:13 | 
2  | 97   | 2  | 24.68  | 2014-01-20 16:05:35 | 
3  | 98   | 2  | 26.75  | 2014-01-20 16:13:23 | 

당신이 볼 수 있듯이, 그것은 그룹에 의해 그리고 ID는 정확하지만 행 값의 나머지는 아니.

어떻게 제대로 그룹화 SELECT 첫번째 및/또는 마지막 행은 여러 열을 구입할 수 있습니까?

답변

1
SELECT o.`bid_id`,o.`buyer_id`,o.`item_id`,o.`amount`,o.`time` FROM `offers` o 
JOIN 
(SELECT MIN(`bid_id`) AS `bid_id`,`buyer_id`,`item_id`,`amount`,`time` FROM `offers` GROUP BY `buyer_id`,`item_id`)x 
ON x.bid_id=o.bid_id AND x.buyer_id=o.buyer_id 
0

첫 번째 이벤트의 SQL :

SELECT 
* 
FROM 
    offers AS o1 
WHERE 
NOT EXISTS (
    SELECT 
     1 
    FROM 
     offers o2 
    WHERE 
     o1.buyer_id = o2.buyer_id 
    AND o1.item_id = o2.item_id 
    AND datetime(o1.time) > datetime(o2.time) 
) 

마지막 이벤트의 SQL은 : 그냥 날짜로 변경 (o1.time) < 날짜 (o2.time) (내가 SQLite는 사용 ~)

-1

원하는 출력 쿼리 아래 시도하십시오 변경해야합니다. SQL FIDDLE 링크 : http://sqlfiddle.com/#!2/916c2/15

(select f.bid_id,f.buyer_id,f.item_id,f.amount,f.time from offers f join 
    (select buyer_id,item_id,min(time) as time from offers 
    group by buyer_id,item_id)t 
    on f.buyer_id=t.buyer_id and f.item_id=t.item_id 
    and f.time=t.time) 
    union 
    (select f.bid_id,f.buyer_id,f.item_id,f.amount,f.time from offers f join 
    (select buyer_id,item_id,max(time) as time from offers 
    group by buyer_id,item_id)t 
    on f.buyer_id=t.buyer_id and f.item_id=t.item_id 
    and f.time=t.time); 
관련 문제