好吧,我已经有了一个唯一的标识符,并且在某一时刻,这些标识符以及随之而来的行都被克隆了。
为了保留这些行(其中一些是合法的),我们去掉了给定 ID 的最后 3 个字符,并为其添加了三个新字符。
我想获取由多个截断 ID 标识的所有唯一标识符 - 例如:
ID 1:
123456789
ID 2:
123456888
我想查看子字符串(在本例中为 123456),并获取包含它的两个值。
这是我目前拥有的:
select substr(uuid, 1, 33) as substring, uuid
from node
where uuid like concat('', substr(uuid, 1, 33), '%')
and count(substr(uuid, 1, 33)) > 1
但是我得到“组功能的无效使用”。我应该使用group by
和having
吗?在这种情况下我将如何正确使用它们?
我的目标是获取 uuid 字段中多次具有给定 uuid 字段子字符串的每一项。
因此,任何包含另一个 uuid 所包含的给定字符串的 uuid(即 uuid 中存在重复的子字符串)都应该被拉出并显示。
例如,此查询为我提供了包含我想要的 uuid 的子字符串,但它没有为我提供 uuid 本身:
select substr(uuid, 1, 33) as substring, uuid from node where uuid like concat('', substr(uuid, 1, 33), '%') group by substring having count(substring) > 1
我想要与子字符串关联的 uuid,如下所示:
子字符串:
0e3c1fef-3958-436b-8e2b-0c6f7b7be
uuid:
0e3c1fef-3958-436b-8e2b-0c6f7b7be212
0e3c1fef-3958-436b-8e2b-0c6f7b7be075
0e3c1fef-3958-436b-8e2b-0c6f7b7be981
基本上所有 uuid 都与子字符串的多个实例关联。
该特定子字符串的计数为 3。
最佳答案
聚合函数不能在 WHERE
子句中使用,只能在 HAVING
中使用。
SELECT uuid
FROM node
WHERE SUBSTR(uuid, 1, 33) IN (
SELECT substr(uuid, 1, 33) as substring
FROM node
GROUP BY substring
HAVING COUNT(*) > 1
)
另一种可能更好地使用索引的编写方法是:
SELECT uuid
FROM node AS n
JOIN (SELECT CONCAT(SUBSTR(uuid, 1, 33), '%') AS pattern
FROM node
GROUP BY pattern
HAVING COUNT(*) > 1) AS p
ON n.uuid LIKE p.pattern
关于mysql - 当 substr 大于 1 时获取列的所有实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24395146/