使用sql语句 从一张表中 获取 ancestors字段中出现逗号数最多和第二多的数据
时间: 2024-03-20 16:39:10 浏览: 92
您可以使用MySQL的内置函数`LENGTH()`和`SUBSTRING_COUNT()`来实现这个需求。具体的SQL语句如下:
```
SELECT ancestors FROM table_name
ORDER BY
SUBSTRING_COUNT(ancestors, ',') DESC,
LENGTH(ancestors) DESC
LIMIT 2;
```
解释一下:
1. 使用`ORDER BY`子句按照逗号数从高到低排序,如果逗号数相同,按照字段长度从长到短排序;
2. 使用`LIMIT`子句限制结果集只返回前两个。
请将`table_name`替换为您所需要的表名。
相关问题
使用sql语句 从一张表中 获取 ancestors字段中出现逗号数最多和第二多的所有数据不能使用SUBSTRING_COUNT()
如果不能使用`SUBSTRING_COUNT()`函数,可以使用`REPLACE()`函数来实现逗号替换的功能。具体的SQL语句如下:
```
SELECT ancestors
FROM table_name
WHERE LENGTH(ancestors) - LENGTH(REPLACE(ancestors, ',', '')) =
(SELECT MAX(LENGTH(ancestors) - LENGTH(REPLACE(ancestors, ',', ''))) FROM table_name)
OR LENGTH(ancestors) - LENGTH(REPLACE(ancestors, ',', '')) =
(SELECT MAX(LENGTH(ancestors) - LENGTH(REPLACE(ancestors, ',', ''))) FROM table_name WHERE LENGTH(ancestors) - LENGTH(REPLACE(ancestors, ',', '')) < (SELECT MAX(LENGTH(ancestors) - LENGTH(REPLACE(ancestors, ',', ''))) FROM table_name))
```
解释一下:
1. 使用`REPLACE()`函数将逗号替换为空字符串,并计算替换前后的长度差,即为逗号数;
2. 使用子查询找到最大的逗号数和第二大的逗号数,分别对应主查询中`WHERE`子句中的两个条件;
3. 返回满足条件的`ancestors`字段。
请将`table_name`替换为您所需要的表名。注意,这种方法效率较低,因为需要进行多次子查询。
for (SysRole role : user.getRoles()) { String dataScope = role.getDataScope(); if (!DATA_SCOPE_CUSTOM.equals(dataScope) && conditions.contains(dataScope)) { continue; } if (StringUtils.isNotEmpty(permission) && StringUtils.isNotEmpty(role.getPermissions()) && !StringUtils.containsAny(role.getPermissions(), Convert.toStrArray(permission))) { continue; } if (DATA_SCOPE_ALL.equals(dataScope)) { sqlString = new StringBuilder(); conditions.add(dataScope); break; } else if (DATA_SCOPE_CUSTOM.equals(dataScope)) { sqlString.append(StringUtils.format( " OR {}.dept_id IN ( SELECT dept_id FROM sys_role_dept WHERE role_id = {} ) ", deptAlias, role.getRoleId())); } else if (DATA_SCOPE_DEPT.equals(dataScope)) { sqlString.append(StringUtils.format(" OR {}.dept_id = {} ", deptAlias, user.getDeptId())); } else if (DATA_SCOPE_DEPT_AND_CHILD.equals(dataScope)) { sqlString.append(StringUtils.format( " OR {}.dept_id IN ( SELECT dept_id FROM sys_dept WHERE dept_id = {} or find_in_set( {} , ancestors ) )", deptAlias, user.getDeptId(), user.getDeptId())); } else if (DATA_SCOPE_SELF.equals(dataScope)) { if (isNotBlank(userAlias)) { sqlString.append(StringUtils.format(" OR {}.user_id = {} ", userAlias, user.getUserId())); } else { // 数据权限为仅本人且没有userAlias别名不查询任何数据 sqlString.append(StringUtils.format(" OR {}.dept_id = 0 ", deptAlias)); } } conditions.add(dataScope); } 减少循环中break和continue语句的总数,最多使用一条。
可以使用一个条件语句来代替break和continue语句。在需要退出循环的地方设置一个boolean类型的变量,然后在循环结束后根据该变量的值判断是否需要继续执行。例如:
```
boolean shouldContinue = false;
for (SysRole role : user.getRoles()) {
String dataScope = role.getDataScope();
if (!DATA_SCOPE_CUSTOM.equals(dataScope) && conditions.contains(dataScope)) {
continue;
}
if (StringUtils.isNotEmpty(permission) && StringUtils.isNotEmpty(role.getPermissions())
&& !StringUtils.containsAny(role.getPermissions(), Convert.toStrArray(permission))) {
continue;
}
if (DATA_SCOPE_ALL.equals(dataScope)) {
sqlString = new StringBuilder();
conditions.add(dataScope);
shouldContinue = true;
} else {
conditions.add(dataScope);
if (DATA_SCOPE_CUSTOM.equals(dataScope)) {
sqlString.append(StringUtils.format(
" OR {}.dept_id IN ( SELECT dept_id FROM sys_role_dept WHERE role_id = {} ) ", deptAlias,
role.getRoleId()));
} else if (DATA_SCOPE_DEPT.equals(dataScope)) {
sqlString.append(StringUtils.format(" OR {}.dept_id = {} ", deptAlias, user.getDeptId()));
} else if (DATA_SCOPE_DEPT_AND_CHILD.equals(dataScope)) {
sqlString.append(StringUtils.format(
" OR {}.dept_id IN ( SELECT dept_id FROM sys_dept WHERE dept_id = {} or find_in_set( {} , ancestors ) )",
deptAlias, user.getDeptId(), user.getDeptId()));
} else if (DATA_SCOPE_SELF.equals(dataScope)) {
if (isNotBlank(userAlias)) {
sqlString.append(StringUtils.format(" OR {}.user_id = {} ", userAlias, user.getUserId()));
} else {
// 数据权限为仅本人且没有userAlias别名不查询任何数据
sqlString.append(StringUtils.format(" OR {}.dept_id = 0 ", deptAlias));
}
}
}
if (shouldContinue) {
break;
}
}
```
阅读全文