MySQL: перечисление внутри группы (банан, 1 / банан, 2 / банан, 3 / яблоко, 1 …)

Я «сгруппировал» запрос. Это запрос технических деталей с версиями.

Подобно:

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, чтобы творить чудеса?

0

Решение

Это может быть сделано одним из тех волосатых запросов с @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 предлагают ранжирование).

2

Другие решения

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
0

Вам нужно использовать переменную для 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

Проверь мой Скрипка Демо

0
По вопросам рекламы [email protected]