2012-09-27 2 views
1

, 나는 빠르게 테이블 구조가 얼마나 이상 갈 것 같은 테이블에서, 각 카테고리에서 4 개 최신 행을 가져 MySQL의 게시물/주제 테이블 :내 문제를 설명하기 전에

int  int**  UNIX Time  Int  Int 
-------------------------------------------------- 
| id | category | postdate | topic_id | is_topic | 
-------------------------------------------------- 
| 1 | a  | 12345678 | 1  |  1 | 
-------------------------------------------------- 
| 2 | a  | 12345678 | 1  |  0 | 
-------------------------------------------------- 
| 3 | b  | 12345678 | 3  |  1 | 
-------------------------------------------------- 
| 4 | b  | 12345678 | 3  |  0 | 
-------------------------------------------------- 
| 5 | c  | 12345678 | 5  |  1 | 
-------------------------------------------------- 
| 6 | c  | 12345678 | 5  |  0 | 
-------------------------------------------------- 

** 글자를 사용하여 테이블을 읽기가 더 편리합니다.

각 카테고리에 대해 4 개의 최신 행을 검색하려고하는데 GROUP BY를 사용하여 각 카테고리에서 최신 1 개를 가져올 수 있지만 각 카테고리에 대해 여러 항목을 얻는 방법을 모르겠습니다.

나는 이런 식으로 뭔가를 시도 :

SELECT * 
FROM posts p 
WHERE NOT EXISTS 
(
    SELECT * 
    FROM posts 
    WHERE category = p.category 
    LIMIT 4 
) 

나는 또한 SO에 여기에 몇 가지 다른 답변을 위해 제공되는 다른 답변 사람들의 몇 가지 작업을했지만, 내가 그들을 맞게 만들 수있을 것 같지 않았다 나의 목적.

mysql이 이러한 복잡한 쿼리와 관련하여 강력한 측면이 아니기 때문에 여기서는 완전히 잃어 버렸습니다.

도움말 또는 올바른 방향의 포인터는 정말 감사하겠습니다!

감사합니다.

업데이트 : 카테고리 수는 정적이 아니며 변경됩니다. 이 같은

답변

2

뭔가 아마 할 것 :

select * from 
    (select 
     @rank:=CASE WHEN @ranked <> category THEN 1 ELSE @rank+1 END as rank, 
     id, 
     category, 
     postdate, 
     topic_id, 
     is_topic 
     @ranked:=category 
    from 
      (select @rank := -1) a, 
      (select @ranked :=- -1) b, 
      (select * from posts order by category, postdate desc) c 
    ) ranked_posts 
where ranked_posts.rank <= 4 

은 기본적으로 여기에 무슨 일이 일어나고 있는지 나는 다른 엔진에 "순위"기능의 선물을 만들기 위해 노력하고 있다는 점이다 (MS SQL 염두에 온다).

쿼리는 모든 게시물을 범주별로 정렬하고 postdate하며 카테고리가 변경 될 때 순위를 재설정하는 모든 행에 "순위"번호를 추가합니다. 마찬가지로 :

rank | category 
1   a  
2   a  
... 
100  a  
1   b 
2   b 
1   c 
2   c 
3   c 

당신은 "서브 쿼리는"테이블을 모방하기 위해 내부 그럼 그냥 = 4 순위 <이 행 (당신이 필요로하는 것)을 선택 그렇게. 더 많거나 적게 필요하면 그 수를 조정할 수 있습니다.

명심해야 할 것은 주문이 중요하거나 순위가 모두 엉망이된다는 것입니다. 카테고리는 "그룹화"되어야합니다. 따라서 ORDER BY category을 입력 한 다음 그룹 기준을 postdate desc으로 정렬하십시오.

+0

답장을 보내 주셔서 감사합니다. 나는 그에게 스윙을 줄 것이다. 세션 변수 (?)를 사용한다는 사실을 제외하고이 쿼리를 많이 이해하지 못합니다. 어떻게 작동하는지에 대해 더 많이 이해하고 싶습니다. 무리 감사! – MrE

+0

확실한 것은 몇 분 내놔. –

+0

정말 고맙습니다! 고마워요! – MrE

관련 문제