Я «сгруппировал» запрос. Это запрос технических деталей с версиями.
Подобно:
ID , GlobalID, Name , DateCreated
413, 17, Masterscrew , 17.10.2014
421, 17, Masterscrew , 28.10.2014
482, 29, Bluescrew , 11.08.2014
519, 17, Masterscrew B, 01.12.2014
Цель состоит в том, чтобы сделать запрос, который имеет что-то вроде этого в результате:
GlobalID, Version, ID, Date
17, 1, Masterscrew, 413, 17.10.2014
17, 2, Masterscrew, 421, 28.10.2014
17, 3, Masterscrew B, 519, 01.12.2014
29, 1, Bluescrew, 482, 11.08.2014
Задачей для является столбец «Версия». Есть ли какое-нибудь заклинание, которое я могу наложить на MySQL, чтобы творить чудеса?
Это может быть сделано одним из тех волосатых запросов с @ID
переменные в нем.
SELECT (@ID := IF(@Prev <> GlobalID, 1, @ID + 1)) version,
(@Prev := GlobalID) GlobalID,
Name,
ID,
STR_TO_DATE(DateCreated, '%d.%m.%Y') DateCreated
FROM parts,
( SELECT @ID := 0, @Prev := 0 ) A
ORDER BY GlobalID, ID
сделает свое дело. http://sqlfiddle.com/#!2/82a36/15/0
@ID
переменная увеличивается каждый раз, когда появляется новая строка с тем же GlobalID
значение и сбрасывается в ноль при его изменении. @Prev
переменная отслеживает предыдущую строку GlobalID
значение.
Эта строка инициализирует эти две переменные.
( SELECT @ID := 0, @Prev := 0 ) Init
Не меняйте порядок первых двух столбцов в SELECT, иначе запрос больше не будет работать. (Это мрачный взлом MySQL; другие RDMS предлагают ранжирование).
SET @VERSION_NUM=0;
SET @PREV_GLOBALID=0;
SELECT
ID,
IF(@PREV_GLOBALID!=GlobalID,@VERSION_NUM:=1, @VERSION_NUM:=@VERSION_NUM+1) as version,
@PREV_GLOBALID:=GlobalID as GlobalID,
name,
DateCreated
FROM parts
ORDER BY GlobalID ASC, id ASC
Вам нужно использовать переменную для GlobalID
сказать @GlobalID
чтобы сравнить, если есть изменение GlobalID, а затем сбросить счетчик на 1, в противном случае добавьте 1, например:
@Num := if(@GlobalID<>GlobalID,1,ifnull(@Num,0)+1) as Num
,@GlobalID := GlobalID
Затем создайте полный подзапрос, который вы могли бы использовать позже:
SELECT ID, GlobalID, Name, DateCreated as `Date`,
@Num := if(@GlobalID<>GlobalID,1,ifnull(@Num,0)+1) as Num
,@GlobalID := GlobalID
FROM tbl, (SELECT @Num:=0) A
ORDER BY GlobalID
использование CONCAT функция для объединения строк и чисел и последующего использования подзапроса, который у вас был ранее, поэтому полный запрос теперь будет выглядеть так:
SELECT GlobalID, CONCAT(Num,', ',Name) as Version
,ID, `Date`
FROM (
SELECT ID, GlobalID, Name, DateCreated as `Date`,
@Num := if(@GlobalID<>GlobalID,1,ifnull(@Num,0)+1) as Num
,@GlobalID := GlobalID
FROM tbl, (SELECT @Num:=0) A
ORDER BY GlobalID ) t
Проверь мой Скрипка Демо