2016-06-06 5 views
2

상태 테이블이 프로필 테이블과 연결된 2 개의 테이블이 있습니다. 프로파일 테이블 저장 고유 tagId 및 상태 테이블은 다중 중복 tagid 항목을 저장합니다. 나는 tagid의 마지막 레코드와 첫 레코드로 그룹을 보여주고 싶다.마지막 레코드 및 첫 번째 레코드 별 Mysql 쿼리 그룹

표 : 참고 프로필 : tagId는 고유

-------------------------------------------------------------------- 
| tagId(PK) | blah2 | blah3 | blah4 | 
-------------------------------------------------------------------- 
101   | 
102   | 
103   | 
104   | 
105   | 
106   | 

테이블 : 상태

내가 지난 statusType

쿼리 결과에 의해 첫 번째 날짜 및 그룹별로 그룹을 시도하려는 어떤

-------------------------------------------------------------------- 
statusId | tagId | date  | height| weight | statusType | blah2 | 
-------------------------------------------------------------------- 
1  | 101 | 2010-01-01 | 5.6 | 300 | single  | 
2  | 102 | 2010-01-01 | 5.7 | 300 | single  | 
3  | 101 | 2015-01-01 | 5.6 | 310 | married | 
4  | 103 | 2010-01-01 | 5.6 | 300 | single  | 
5  | 104 | 2010-01-01 | 5.6 | 300 | single  | 
6  | 101 | 2016-01-01 | 5.6 | 300 | pregnant | 
7  | 101 | 2016-09-01 | 5.6 | 300 | delivery | 
8  | 105 | 2010-01-01 | 5.6 | 300 | single  | 

다음과 같이됩니다 :

-------------------------------------------------------------------- 
| tagId | date  | height| weight | statusType | blah2 | 
-------------------------------------------------------------------- 
| 101 | 2010-01-01 | 5.6 | 300 | delivery | 
| 102 | 2010-01-01 | 5.7 | 300 | single  | 
| 103 | 2010-01-01 | 5.6 | 300 | single  | 
| 104 | 2010-01-01 | 5.6 | 300 | single  | 
| 105 | 2010-01-01 | 5.6 | 300 | single  | 
01 23,516,

는하지만 그것으로 성공,이 MySQL의 코드

SELECT DISTINCT Profile.TagId,Status.date,Status.StatusType,Status.height,Status.weight FROM Profile 
LEFT JOIN Status ON Status.TagId = Profile.TagId 
Where Status.StatusId In(Select Max(Status.StatusId) From Status Group By  Status.TagId) 
Group By Status.TagId ORDER BY Profile.TagId ASC, Status.TagId DESC 

으로 시도하지 수 있지만이

쿼리 결과처럼, 마지막 날짜와 마지막 statustype를 반환

-------------------------------------------------------------------- 
| tagId | date  | height| weight | statusType | blah2 | 
-------------------------------------------------------------------- 
| 101 | 2016-09-01 | 5.6 | 300 | delivery | 
| 102 | 2010-01-01 | 5.7 | 300 | single  | 
| 103 | 2010-01-01 | 5.6 | 300 | single  | 
| 104 | 2010-01-01 | 5.6 | 300 | single  | 
| 105 | 2010-01-01 | 5.6 | 300 | single  | 
+0

'높이'와 '무게'란 무엇입니까? – Blank

+0

신장, 체중 @Reno에 대해 잊어 버려 –

+0

난 그냥 이해가 안되지만 – Strawberry

답변

1

I 아마도 다음과 같은 것을 찾고 있다고 생각하십니까?

SELECT DISTINCT p.tagId, 
       smin.`date`, smin.height, smin.weight, 
       smax.StatusType 
FROM Profile AS p 
LEFT JOIN (
    SELECT tagId, MAX(`date`) AS max_date, MIN(`date`) AS min_date 
    FROM Status 
    GROUP BY tagId 
) AS s ON p.tagId = s.tagId 
LEFT JOIN Status AS smin ON smin.tagId = p.tagId AND s.min_date = smin.`date` 
LEFT JOIN Status AS smax ON smax.tagId = p.tagId AND s.max_date = smax.`date` 

쿼리는 tagId 당 최소 및 최대 date 값을 반환하는 파생 테이블을 사용합니다. 우리가 Status 테이블에 가입하고 최소date최대date 값을 갖는 Status 레코드에 대한StatusType 값을 갖는 Status 기록에서 date, heightweight 값을 얻을 수 있습니다 이러한 값을 사용.

1

확실하지 않음이 아닌지를 원하지만 단지 그것을 시도하고 내가 질문을 오해하지 않았 으면 경우는

SQL Fiddle

의 MySQL 5.6 설치) :

CREATE TABLE status 
    (`statusId` int, `tagId` int, `date` date, `height` int, `weight` int, `statusType` varchar(8)) 
; 

INSERT INTO status 
    (`statusId`, `tagId`, `date`, `height`, `weight`, `statusType`) 
VALUES 
    (1, 101, '2010-01-01', 5.6, 300, 'single'), 
    (2, 102, '2010-01-01', 5.7, 300, 'single'), 
    (3, 101, '2015-01-01', 5.6, 310, 'married'), 
    (4, 103, '2010-01-01', 5.6, 300, 'single'), 
    (5, 104, '2010-01-01', 5.6, 300, 'single'), 
    (6, 101, '2016-01-01', 5.6, 300, 'pregnant'), 
    (7, 101, '2016-09-01', 5.6, 300, 'delivery'), 
    (8, 105, '2010-01-01', 5.6, 300, 'single') 
; 

검색어 1 :

select f.`tagId`, date_format(l.`date`, '%Y-%m-%d') as `date`, f.`statusType` 
from (
    select s.* 
    from `status` s 
    inner join (
     select max(`statusId`) as `statusId`, `tagId` 
     from `status` 
     group by `tagId`) t on s.`statusId` = t.`statusId` and s.`tagId` = t.`tagId` 
    ) f 
inner join (
    select s.* 
    from `status` s 
    inner join (
     select min(`statusId`) as `statusId`, `tagId` 
     from `status` 
     group by `tagId`) t on s.`statusId` = t.`statusId` and s.`tagId` = t.`tagId` 
    ) l on f.`tagId` = l.`tagId` 
order by tagId 

Results :

| tagId |  date | statusType | 
|-------|------------|------------| 
| 101 | 2010-01-01 | delivery | 
| 102 | 2010-01-01 |  single | 
| 103 | 2010-01-01 |  single | 
| 104 | 2010-01-01 |  single | 
| 105 | 2010-01-01 |  single | 

하위 쿼리 f 각 그룹에 의해 처음 기록하고 l 각 그룹에 의해 마지막 기록이다, 당신은 height 또는 weight 열을 원하는 경우, 당신이 선호하는 그들 중 하나를 선택하십시오 에.

은 또한 당신은 당신이 = (106) tagId를 얻을 수 profile이 모든 쿼리를 left join 수 있지만,이 기록은 열 datestatusType 당신에게 null을 줄 것이다.

관련 문제