2012-01-28 4 views
0

나는 mysql 테이블에 이름과 시간을 기록한 것처럼 각 이름에 대해 마지막 5 레코드를 선택하려고한다. 나는이 조인을 할 수 없다. 어떤 도움?mysql 마지막 5 행을 유지하고 오래된 레코드를 제거

샘플 데이터 내가 displaly하려면이 데이터에서

CREATE TABLE `ntest` 
( `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(100) DEFAULT NULL, 
    `updated_at` timestamp NOT NULL 
     DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`) 
) 


INSERT INTO `ntest` VALUES 
(1,'java','2012-01-28 21:14:01'), 
(2,'java','2012-01-28 21:14:03'), 
(3,'java','2012-01-28 21:14:04'), 
(4,'perl','2012-01-28 21:14:08'), 
(5,'perl','2012-01-28 21:14:09'), 
(6,'perl','2012-01-28 21:14:09'), 
(7,'perl','2012-01-28 21:14:10'), 
(8,'perl','2012-01-28 21:14:11'), 
(9,'perl','2012-01-28 21:14:11'), 
(10,'perl','2012-01-28 21:14:12'), 
(11,'perl','2012-01-28 21:14:13'), 
(12,'perl','2012-01-28 21:14:14'), 
(13,'mysql','2012-01-28 21:14:21'), 
(14,'mysql','2012-01-28 21:14:22'), 
(15,'mysql','2012-01-28 21:14:22'), 
(16,'mysql','2012-01-28 21:14:23'), 
(17,'mysql','2012-01-28 21:14:23'), 
(18,'mysql','2012-01-28 21:14:24'), 
(19,'mysql','2012-01-28 21:14:25'), 
(20,'mysql','2012-01-28 21:14:25'), 
(21,'mysql','2012-01-28 21:14:26'), 
(22,'mysql','2012-01-28 21:14:26'), 
(23,'mysql','2012-01-28 21:14:27'), 
(24,'mysql','2012-01-28 21:14:27'), 
(25,'php','2012-01-28 21:21:27') 

. 마지막 다섯 자바, MySQL은, 펄 및 PHP 기록

편집 : 귀하의 대답에 따라 나는 SQL 함께 왔어,하지만 내가 원하는 방식으로 작동하지 않습니다.

select 
     NameCounts.name, 
     NameCounts.updated_at, 
     NameCounts.numnames, 
     @RankSeq := if(@LastDistrict = NameCounts.name, @RankSeq +1, 1) DistRankSeq, 
     @LastDistrict := NameCounts.name as ignoreIt 
    from 
     (select a.name, a.updated_at, count(*) as numnames 
      from ntest a 
      group by a.name, a.updated_at 
      order by 
       a.name, a.updated_at desc) NameCounts 
     JOIN (select @RankSeq := 0, @LastDistrict = 0) SQLVars 
    HAVING 
     DistRankSeq <= 5 

결과 :

+-------+---------------------+----------+-------------+----------+ 
| name | updated_at   | numnames | DistRankSeq | ignoreIt | 
+-------+---------------------+----------+-------------+----------+ 
| java | 2012-01-28 19:21:47 |  1 |   1 | java  | 
| java | 2012-01-28 16:14:04 |  1 |   3 | java  | 
| java | 2012-01-28 16:14:03 |  1 |   5 | java  | 
| mysql | 2012-01-28 16:14:27 |  2 |   1 | mysql | 
| mysql | 2012-01-28 16:14:26 |  2 |   3 | mysql | 
| mysql | 2012-01-28 16:14:25 |  2 |   5 | mysql | 
| perl | 2012-01-28 19:22:18 |  1 |   1 | perl  | 
| perl | 2012-01-28 16:14:14 |  1 |   3 | perl  | 
| perl | 2012-01-28 16:14:13 |  1 |   5 | perl  | 
| php | 2012-01-28 19:21:40 |  1 |   1 | php  | 
| php | 2012-01-28 16:21:27 |  1 |   3 | php  | 
+-------+---------------------+----------+-------------+----------+ 

내가 펄의 5 개 행을 기대는

mysql> select * from ntest where name='perl'; 
+----+------+---------------------+ 
| id | name | updated_at   | 
+----+------+---------------------+ 
| 4 | perl | 2012-01-28 16:14:08 | 
| 6 | perl | 2012-01-28 16:14:09 | 
| 7 | perl | 2012-01-28 16:14:10 | 
| 9 | perl | 2012-01-28 16:14:11 | 
| 10 | perl | 2012-01-28 16:14:12 | 
| 11 | perl | 2012-01-28 16:14:13 | 
| 12 | perl | 2012-01-28 16:14:14 | 
| 28 | perl | 2012-01-28 19:22:18 | 
+----+------+---------------------+ 
8 rows in set (0.00 sec) 

답변

0

SELECT * FROM TABLE WHERE NAME IN('java') LIMIT 5 UNION SELECT * FROM TABLE WHERE NAME IN('mysql') LIMIT 5 ...

+0

빠른 응답을 주셔서 감사합니다.하지만 내 이름은 동적입니다. 100 개의 다른 이름을 가질 수 있습니다. – sfgroups

+0

MySQL에서 상위 5 개를 사용할 수 없습니다. – sfgroups

+0

코드에서 SQL을 생성하는 것만으로 내 마음에 왔습니다. –

0

answer on this post 한 번 봐 ... 그것은 항목과 수익을 평가하기 위해 노력하고 "그룹"(또는 귀하의 경우 이름) 당 1 "having"절을 < = 5로 변경하면되지만 쿼리의 컨텍스트는 필요한 것을 수행해야합니다.

+0

대답 해 주셔서 감사합니다. SQL과 함께 왔지만, 그것은 단지 3 행을 제공합니다, 어떻게 마지막 5 행을 얻을 수 있습니까? – sfgroups

+0

@sfgroups, 나는 그것을 이해하지 못한다. 그러나 1, 3, 5로 건너 뛰는 것처럼 보인다 ... 평균 시간에 한계를 9로 변경해 보라. 테스트를 실행하기 위해 MySQL 머신을 가지고 있지 않다. , 그러나 나는 당신이 패턴을보고 어떻게 생각합니다 ... 왜 예상대로하지 못했지만, 나는이 시점에서만 추측 할 수있었습니다. COUNT (*)와 그룹을 없애십시오 ... 내부가 모든 레코드를 가져 와서 내림차순으로 updated_at로 이름순으로 적절히 정렬되도록하십시오. 그룹화는 딸꾹질을 던져야합니다. – DRapp

관련 문제