好的,我已经获得了一个唯一的标识符,并且在某一时刻,这些标记符被克隆,以及随之而来的行。
为了保留这些行(其中一些是合法的),我们取出了给定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中有一个重复的子字符串)都应该被拉出并显示出来。
例如,这个查询给了我带有我想要的uuids的子串,但是它并没有给我自己的uuids:
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
所以基本上所有的uuids都与子串的多个实例相关联。
此特定子字符串的计数为3。
答案 0 :(得分:1)
汇总函数不能在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