2010-01-08 4 views
6

Tengo una tabla en MySQL Ha datos como¿Quieres número de fila en el grupo de columna en MY SQL?

 
Id Name 
1 test 
1 test 
1 test123 
2 test222 
3 test333 

quiero que los datos como

 
Id Name  RowNum 
1 test  1 
1 test  2 
1 test123 1 
2 test222 1 
3 test333 1 

medios yo quiero asignar el número de fila en grupo de identificador y el nombre?

¿Cuál debería ser el script de la misma?

Respuesta

8

Esta definición de la tabla va a lograr lo que quiere.

CREATE TABLE `test` (
    `Id` int(10) unsigned NOT NULL, 
    `Name` varchar(45) NOT NULL, 
    `RowNum` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`Id`,`Name`,`RowNum`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

tabla Rellenar con los datos

INSERT INTO test VALUES 
(1,"test",null), 
(1,"test",null), 
(1,"test123",null), 
(2,"test222",null), 
(3,"test333",null); 

seleccionar datos de la tabla

SELECT * FROM test; 

de Resultados

1, 'test', 1 
1, 'test', 2 
1, 'test123', 1 
2, 'test222', 1 
3, 'test333', 1 

por hacerlo en una consulta que aquí hay una manera bastante cruda de haciéndolo.

select g.id,g.name,g.rownum 
from (
    select t.id,t.name, 
     @running:=if(@previous=concat(t.id,t.name),@running,0) + 1 as rownum, 
     @previous:=concat(t.id,t.name) 
    from test t 
    order by concat(t.id,t.name) 
) g; 
+0

Gracias, si es posible, sin crear la clave principal, y es posible con la consulta. – Paresh

+0

Este método se basa en tener una clave primaria compuesta. Podría haber otras formas de hacerlo con una consulta. Era solo la solución que sabía de antemano. –

+0

@Paresh, agregué una consulta para obtener el mismo efecto. –

1

UPDATE tablename SET RowNum=(SELECT COUNT(Id) FROM tablename WHERE Id=Name)

+0

No funciona, intenta este – Paresh

+0

Quiero que el rownum como si ID y el nombre son iguales, entonces se debe incrementarse en uno chico – Paresh

1

Oracle y MSSQL apoyarían

SELECT Id, Name, row_number() OVER(partition by Id, Name order by Id) AS RowNum FROM table 

(respuesta no ayuda a la OP que está en MySQL, pero añadió esté completo)

6

Ésta es otra manera con una consulta que es más sencillo (al menos para mí):

SELECT 
a.Id, a.Name, 
(SELECT COUNT(*) FROM test 
WHERE Id = a.Id AND `Name` = a.Name AND row_id < a.row_id) AS RowNum 
FROM test AS a 
ORDER BY a.row_id; 

Esto supone existe un mundial row_id (por ejemplo, una clave primaria de incremento automático en su tabla).

1
select id, name, (select count(*) + 1 from table as i where i.id = p.id and i.id < p.id) from table p; 
Cuestiones relacionadas