2014-02-18 4 views
0

이름이 a이고 b 인 이름을 가진 mysql 테이블이 있고 그 다음에 cluster이 있습니다. mysql 테이블에 카운트 값이있는 열을 추가하는 방법은 무엇입니까?

+--------+-----------+----------+---------+ 
| names | a   | b  | cluster | 
+--------+-----------+----------+---------+ 
| Johny | 225630096 |  447 |  3 | 
| Johny | 225630118 |  491 |  4 | 
| Johny | 225630206 |  667 |  5 | 
| Johny | 225630480 |  1215 |  6 | 
| Johny | 225630677 |  1609 |  7 | 
| Johny | 225631010 |  2275 |  8 | 
| Manny | 154247076 |  6235 |  1 | 
| Manny | 154247079 |  6241 |  1 | 
| Manny | 154247083 |  6249 |  1 | 
| Manny | 154247084 |  6251 |  1 | 
| Manny | 154247087 |  6257 |  1 | 
| Manny | 154247090 |  6263 |  1 | 
| Manny | 154247091 |  6265 |  1 | 
| Manny | 154247093 |  6269 |  1 | 
| Manny | 154247097 |  6277 |  1 | 
| Manny | 154247098 |  6279 |  1 | 
| Manny | 154247099 |  6281 |  1 | 
| Manny | 154247100 |  6283 |  1 | 
| Manny | 154247555 |  7193 |  2 | 
| Manny | 154247629 |  7341 |  3 | 
| Manny | 154247630 |  7343 |  3 | 
| Manny | 154247633 |  7349 |  3 | 
| Manny | 154247634 |  7351 |  3 | 
| Douges | 146340582 |  6811 |  1 | 

나는 namescluster 열을 기반으로 count 열을 추가하고 싶었다. 예를 들어, 출력에는 각 이름 내의 클러스터 수가 포함됩니다. 대신 클러스터의 수를 계산하는 것, 내가 COUNT 기능을 사용하는 것을 시도했다

+--------+-----------+----------+---------+---------+ 
| names | a   | b  | cluster |count | 
+--------+-----------+----------+---------+---------+ 
| Johny | 225630096 |  447 |  3 | 1 | 
| Johny | 225630118 |  491 |  4 | 2 | 
| Johny | 225630206 |  667 |  5 | 3 | 
| Johny | 225630480 |  1215 |  6 | 4 | 
| Johny | 225630677 |  1609 |  7 | 5 | 
| Johny | 225631010 |  2275 |  8 | 6 | 
| Manny | 154247076 |  6235 |  1 | 1 | 
| Manny | 154247079 |  6241 |  1 | 1 | 
| Manny | 154247083 |  6249 |  1 | 1 | 
| Manny | 154247084 |  6251 |  1 | 1 | 
| Manny | 154247087 |  6257 |  1 | 1 | 
| Manny | 154247090 |  6263 |  1 | 1 | 
| Manny | 154247091 |  6265 |  1 | 1 | 
| Manny | 154247093 |  6269 |  1 | 1 | 

하지만, 예를 들어, 출력은 다음과 같을 것입니다.

+1

[count()]에 대한 RTFM (https://dev.mysql.com/doc/refman/5.1/ko/counting-rows.html)을 작성 했습니까? 원하는 것은 mysql을 사용하여 직접 수행 할 수 없지만 select 내에서 로컬 변수로 가짜 일 수 있습니다. '선택하면 (@prev_name <> 이름, @count : = 1, @count : = @ count + 1) AS 카운트 ... ' –

+0

파이썬을 사용하면이 일을하는 것이 더 바람직 할 것이라고 생각하십니까? – msakya

+0

을 사용하면 쿼리를 쉽게 유지 관리 할 수 ​​있습니다. –

답변

0

하위 쿼리 또는 변수를 사용하여이 작업을 수행 할 수 있습니다. 변수는 일반적으로 더 효율적 :

select t.*, 
     @rn := if(@name = name and @cluster = cluster, @rn, if(@name = name, @rn + 1, 1)) as `count`, 
     @name := name, @cluster := cluster 
from table t cross join 
    (select @rn := 0, @name := '', @cluster := -1) const 
order by name, cluster; 

당신이 (오히려 쿼리의 결과보다는) 테이블에이를 데려 가고 싶다는 create table as 또는 insert into를 사용하는 경우.

하위 쿼리 접근 방식은 다음과 같습니다

select t.*, 
     (select count(distinct cluster) 
     from table t2 
     where t2.name = t.name and 
       t2.cluster <= t.cluster 
     ) as `count` 
from table t; 

성능은 table(name, cluster)에 인덱스로 확인해야합니다. 이 버전은보기에서 사용될 수 있습니다.

+0

고든 고맙습니다. 그러나 변수 접근 방식은 나에게 구문 오류를 주었다. tabulator가 쓰여진 것과 동일하지만 여전히 오류가 계속 발생했습니다. 'SQL 구문에 오류가 있습니다. MySQL 서버 버전에 해당하는 매뉴얼을 확인하여 '테이블 t 크로스 조인'(@rn : = 0, @name : = '', @cluster : = -1 '1 행시 선택' 하위 쿼리 접근법에서 whats 테이블 t2? 감사합니다. – msakya

+0

@mshakya .... "table"이 테이블 이름으로되어 있기 때문에 SQL이 작동합니다. –

관련 문제