2012-06-25 2 views
0

나는 매우 이상한 일을하고 단순히 어떻게해야할지 모릅니다. uid이 작업을하고 entity_id은 누구이며, state이 (다음 또는 팔로우 해제) 작업의 상태,MySQL에서 행의 최신 상태 가져 오기

+------+-----------+-------------+-------+------------+ 
| uid | entity_id | entity_type | state | created | 
+------+-----------+-------------+-------+------------+ 
| 3913 |  1105 |   1 |  0 | 1340617072 | 
| 3913 |  1105 |   1 |  1 | 1340617042 | 
| 3913 |  3930 |   1 |  0 | 1340617071 | 
| 3913 |  3930 |   1 |  1 | 1340617036 | 
+------+-----------+-------------+-------+------------+ 

created 액션이 만들어졌다있는 타임 스탬프를 보유 : 이것은 내 테이블과 데이터입니다 뒤따라오고있는 엔티티 ID.

현재 사용자가 따르는 모든 entity_id을 가져 오는 쿼리를 수행하려고합니다. 우선 내가 사용했다 :

SELECT entity_id FROM follow_objects WHERE uid=? AND entity_type=? 

내가 사람을 따라 한 다음 팔로우를 취소 경우 2 개 항목이 상태 = 1 개 다음 상태와 (이 있기 때문에, 나는 아직도 그 사람에 대한 결과를 얻을 것으로 나타났습니다 그러나 = 0).

그래서 가장 최근의 작업임을 의미하는 가장 최근의 created 열로 행을 가져와야합니다. 그래서 시도했습니다 :

SELECT entity_id FROM follow_objects WHERE uid=? AND entity_type=? group by entity_id HAVING created=MAX(created) 

쓰레기 데이터 만 반환합니다. 나는 아이디어가 없어. 어떤 도움이 필요합니까?

+0

'... ORDER BY created DESC LIMIT 1'? – Bobby

답변

1

그룹 별 최대 인 을 선택해야합니다. subselect에서 최대 값을 랩핑하고 entity_id이 같고 subselect의 최대 시간 소인이 작성된 시간 소인과 같은 곳에서 테이블을 조인해야합니다. 그 결과에서 다음 (최신 첫) 만든 날짜가 일치하는 모든 첫 번째 행과 순서를 선택

SELECT 
    a.entity_id, 
    b.state, 
    b.created 
FROM 
    (
     SELECT entity_id, MAX(created) AS max_created 
     FROM follow_objects 
     WHERE uid = ? AND entity_type = ? 
     GROUP BY entity_id 
    ) a 
INNER JOIN 
    follow_objects b ON 
     a.entity_id = b.entity_id AND 
     a.max_created = b.created 
+0

당신, 나의 각하는 신이다! 변경하지 않고 작업했습니다. 나는이 쿼리를 스토어드 프로 시저에서 4 번 실행해야하기 때문에 하위 쿼리/조인을 원했을 것입니다. 그러나 유효한 솔루션이므로이를 넣을 것입니다. 감사! –

+0

광산에서 속도를 비교하고 싶을 수도 있습니다. 내 테이블이 한 번만 통과하고 조인이 필요 없기 때문에 내 순서가 훨씬 빨라야합니다. – Bohemian

+0

@EduardLuca, 두 필드를 SELECT 절에 추가했습니다. 왜냐하면 모두 entity_id를 선택하고 있기 때문입니다. 당신은 관련 데이터를 필요로하지 않는다. 그렇다면 단지 MAX()가 없어도 그 자체로 subselect를 사용할 수있다. –

0

걸릴 첫 번째 : 결과는 entity_id 그룹 별 상위 행 데이터를 얻을 수 있습니다 것입니다

SELECT entity_id 
FROM (
    select entity_id, created 
    from follow_objects 
    WHERE uid=? 
    AND entity_type=? 
    order by created desc 
) x 
limit 1 

이해하기 쉽고 코드가 작성됩니다.

fyi에서 괄호 뒤에있는 "x"는 거기에서 선택한 모든 결과 집합에 별칭을 부여해야하므로 "x"라고합니다.

+1

당신의 솔루션에서'LIMIT 1'은 가장 최근의'created' 타임 스탬프로 만'entity_id'를 검색 할 것입니다. 여러 개의 다른 'entity_id'가있을 수 있습니다.'uid =? AND entity_type =?'이며 OP는 해당 조건을 만족하는 각 *** entity_id ***와 관련된 최신 행 데이터를 원합니다. –