Php MySQL:在组内枚举(香蕉,1/香蕉,2/香蕉,3/苹果,1…)
我将一个查询分组。这是对具有版本的技术部件的查询 比如: 目标是执行一个结果如下的查询:Php MySQL:在组内枚举(香蕉,1/香蕉,2/香蕉,3/苹果,1…),php,mysql,enumeration,Php,Mysql,Enumeration,我将一个查询分组。这是对具有版本的技术部件的查询 比如: 目标是执行一个结果如下的查询: 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 is的挑战是版本列。我可以对MySQL施展魔法吗?这可以通过其中
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
is的挑战是版本列。我可以对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
不要更改SELECT中前两列的顺序,否则查询将不再工作。这是一个可怕的MySQL攻击;其他RDM提供排名。您需要使用GlobalID变量,比如@GlobalID,以便比较GlobalID是否有变化,然后将计数器重置为1,否则添加1,如:
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
@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
使用函数连接字符串和数字,然后还使用前面的子查询,因此现在的完整查询如下所示:
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
检查我的否。这在任何可扩展的方面都不太可能。请分享您的查询好吗?我从来没有这样使用过MySQL。好主意。塔克斯。
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
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