当substr大于1时获取列的所有实例

时间:2014-06-24 19:53:35

标签: mysql

好的,我已经获得了一个唯一的标识符,并且在某一时刻,这些标记符被克隆,以及随之而来的行。

为了保留这些行(其中一些是合法的),我们取出了给定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 byhaving吗?在这种情况下我如何恰当地使用它们?

我的目标是抓住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。

1 个答案:

答案 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