Нумерация MySQL Result Row - PullRequest
3 голосов
/ 25 октября 2010

У меня есть MySQL набор результатов , как показано ниже

id        name
---------------------
1         abc
1         abc
2         xyz
2         xyz
3         pqr

Теперь мне нужно изменить набор результатов , чтобы он выглядел следующим образом:

id        name
---------------------
1         abc-1
1         abc-2
2         xyz-1
2         xyz-2
3         pqr

Суммирование: мне нужно нумерация столбца имени из набора результатов, и нумерация будет применяться только к строкам, которые имеют более одного значения в наборе результатов. *

так что же будет MySQL SELECT Запрос ?

Ответы [ 2 ]

2 голосов
/ 25 октября 2010

это может сработать, но, возможно, есть лучший способ, о котором я не могу думать сейчас

set @i = 0;

select
 f.id,
 @i:=@i+1 as i,
 case 
  when c.counter <= 1 then f.name 
  else concat(f.name,'-',(@i % c.counter) +1)
 end as name
from
 foo f
join (select id, count(*) as counter from foo group by id) c on c.id = f.id
order by
 f.id,name;

РЕДАКТИРОВАТЬ: как указано в комментариях выше, лучше сделать это на уровне приложения по сравнению с db

2 голосов
/ 25 октября 2010

Я вижу 3 возможных способа решения этой проблемы:

  1. Обновите все значения в БД один раз, а затем проверяйте при каждой вставке / обновлении / удалении, должна ли нумерация обновляться.Насколько я знаю, это можно сделать либо в программе, которая использует базу данных, либо с помощью триггеров

  2. Создать нумерацию с помощью SQL-запроса - для этого потребуется объединить таблицу с самим собой по id, groupрезультаты и подсчитать количество строк с одинаковым идентификатором.Это будет выглядеть следующим образом: select t1.id, t1.name, count(t2.id) from t1, t2 where t1.id = t2.id group by t2.id (Кстати, этот запрос может занять O (N ^ 2) времени, что достаточно для большой таблицы). Затем вам придется проанализировать третий столбец и получить окончательный результат.

  3. Выполните постобработку результата в вашей программе с помощью языка программирования.Это выглядит как самое простое и эффективное решение.

...