如何在mySQL中的组内进行排序(在workBench中工作,而不是在NodeJS中工作)

How can I sequence within a group in mySQL (works in workBench not in NodeJS)

提问人:Steve Geggie 提问时间:10/7/2021 最后编辑:Steve Geggie 更新时间:10/8/2021 访问量:46

问:

我有一个查询,可以在 mySQL workBench 中正确排序,但在 NodeJS 中不能针对同一数据库进行排序。

查询:

 SELECT 
      users.userId,
      users.firstName,
      users.middleName,
      users.lastName,
      users.address,
      users.address2,
      users.city,
      users.stateProvince,
      users.postalCode,
      users.country,
      users.email,
      users.mobilePhone,
      users.altPhone,
      users.ataId,
      users.pitaId,
      users.nssaId,
      users.nscaId,
      users.active,
      @seq := IF(@saveUserId = user2, @seq + 1, 0) as seq,
      permissionsPlus.entityId,
      permissionsPlus.entityName,
      permissionsPlus.entityTypeId,
      permissionsPlus.entityTypeName,
      permissionsPlus.permissionSettings,
      permissionsPlus.roleId,
      permissionsPlus.roleName,
      permissionsPlus.userPermissionId,
      @saveUserId := permissionsPlus.user2 as user2
    FROM sosclays.users
    LEFT JOIN   
     (SELECT userPermissions.*, 
      entityTypes.name AS entityTypeName, 
      IFNULL(sanctioningBodies.name, IFNULL(associations.name, IFNULL(clubs.name, IFNULL(shoots.name, 'App')))) AS entityName, 
      roles.name AS roleName,
      @user2 := userId as user2
      FROM userPermissions 
      LEFT OUTER JOIN sanctioningBodies ON(entityTypeId = 1 AND userPermissions.entityId = sanctioningBodies.sanctioningBodyId) 
      LEFT OUTER JOIN associations ON(entityTypeId = 2 AND userPermissions.entityId = associations.associationId) 
      LEFT OUTER JOIN clubs ON(entityTypeId = 3 AND userPermissions.entityId = clubs.clubId) 
      LEFT OUTER JOIN shoots ON(entityTypeId = 4 AND userPermissions.entityId = shoots.shootId) 
      LEFT OUTER JOIN entityTypes ON(userPermissions.entityTypeId = entityTypes.entityTypeId) 
      LEFT OUTER JOIN roles ON(userPermissions.roleId = roles.roleId)
      ORDER BY userPermissions.userId ASC) permissionsPlus on(users.userId = permissionsPlus.userId)
      ORDER BY users.userId ASC, seq ASC

你能想到为什么它在 Workbench 中工作但在 NodeJS 中不起作用的原因吗?我如何最好地解决这个问题或使用替代方法?

从本质上讲,我正在为从查询的 permissionsPlus 部分提取的许多权限中的每一个寻找一个从 0 开始的序列号。

在mySQL工作台中,我看到用户E7skP0IncSW7wkBxnrYFx6udzGH2的以下正确序列(第三行,seq列)

enter image description here

在 NodeJS 中,seq 列值始终为 0。此外 - 使用 PHPMYAdmin 时,seq 列值始终为 0。

MySQL 序列

评论

0赞 Newbie 10/7/2021
描述异常。提供上下文。提供异常日志。
0赞 nbk 10/7/2021
请为您的代码构建一个 dbfiddle,基本上必须声明 @ 变量
0赞 ysth 10/7/2021
不工作是什么样子的?会发生什么
0赞 Barmar 10/7/2021
您使用的是哪个版本的 MySQL?如果您使用的是 8.x,则应使用 window 函数而不是用户变量。RANK()
0赞 Steve Geggie 10/7/2021
我正在使用 8.x。我在 NodeJS 中没有收到任何错误,所有序列都设置为 0。(在 WorkBench 中,序列是正确的)。我不熟悉RANK

答:

0赞 Steve Geggie 10/8/2021 #1

溶液:

SET @seq = 0;
 SET @saveUserId = '';
 SELECT 
      users.userId,
      @seq := IF(@saveUserId = users.userId, @seq + 1, 0) as seq,
      permissionsPlus.entityId,
      permissionsPlus.entityName,
      permissionsPlus.entityTypeId,
      permissionsPlus.entityTypeName,
      permissionsPlus.permissionSettings,
      permissionsPlus.roleId,
      permissionsPlus.roleName,
      permissionsPlus.userPermissionId,
      @saveUserId := users.userId as saveUser
    FROM sosclays.users
    LEFT JOIN   
     (SELECT userPermissions.*, 
      entityTypes.name AS entityTypeName, 
      IFNULL(sanctioningBodies.name, IFNULL(associations.name, IFNULL(clubs.name, IFNULL(shoots.name, 'App')))) AS entityName, 
      roles.name AS roleName
      FROM userPermissions 
      LEFT OUTER JOIN sanctioningBodies ON(entityTypeId = 1 AND userPermissions.entityId = sanctioningBodies.sanctioningBodyId) 
      LEFT OUTER JOIN associations ON(entityTypeId = 2 AND userPermissions.entityId = associations.associationId) 
      LEFT OUTER JOIN clubs ON(entityTypeId = 3 AND userPermissions.entityId = clubs.clubId) 
      LEFT OUTER JOIN shoots ON(entityTypeId = 4 AND userPermissions.entityId = shoots.shootId) 
      LEFT OUTER JOIN entityTypes ON(userPermissions.entityTypeId = entityTypes.entityTypeId) 
      LEFT OUTER JOIN roles ON(userPermissions.roleId = roles.roleId)
      ORDER BY userPermissions.userId ASC) permissionsPlus on(users.userId = permissionsPlus.userId)
      ORDER BY users.userId ASC, seq ASC