2010-01-08 2 views
6

У меня есть одна таблица в MYSQL Это данные, такие какХотите номер строки в группе столбца в MY SQL?

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

Я хочу, чтобы данные, как

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

означает, что я хочу присвоить номер строки в группе Id и имя?

Какой должен сценарий для этого?

ответ

8

Это определение таблицы будет достичь того, чего вы хотите.

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; 

Populate таблица с данными

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

Выбор данных из таблицы

SELECT * FROM test; 

Результат

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

Для делать это в запросе здесь является довольно грубым способом Делать это.

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

Спасибо парня, если это возможно без создания первичного ключа, и возможно с запросом. – Paresh

+0

Этот метод основан на использовании составного первичного ключа. Могут быть другие способы сделать это с помощью запроса. Это было просто решение, которое я знал заранее. –

+0

@Paresh, я добавил запрос, чтобы получить тот же эффект. –

1

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

+0

Не работаю, пожалуйста, попробуйте это – Paresh

+0

я хочу ROWNUM как если идентификатор и имя одинаковы, то оно должно быть увеличивает одним – Paresh

1

Oracle и MSSQL будет поддерживать

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

(ответ не помогает ОР, который находится на MySQL, но добавил для полноты)

6

Вот еще один способ с запросом, который проще (по крайней мере для меня):

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; 

Это предполагает, существует глобальное row_id (например, первичный ключ с автоматическим инкрементом в вашей таблице).

1
select id, name, (select count(*) + 1 from table as i where i.id = p.id and i.id < p.id) from table p; 
Смежные вопросы