2014-06-24 48 views
0

好吧,我有一個唯一的標識符,並且在一個點上,它們被克隆,以及與它們一起行。當substr大於1時獲取列的所有實例

爲了保留這些行(其中一些是合法的),我們取出給定id的最後3個字符,並給它三個新的字符。

我想要抓住所有其通過截短的ID的倍數標識的唯一標識符 - 例如:

ID 1:

ID 2:

我會喜歡看一下子字符串(在本例中是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。

該查詢,例如,讓我有我想要的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

+0

'count'是一個聚合函數,你的意思'length'? – Fabricator

+0

'uuid LIKE CONCAT('%',substr(uuid,1,33),'%')'始終爲真。一列總是和自己一樣。 – Barmar

+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 
+0

這看起來乍看起來像它應該工作(雖然我選擇uuid不是用戶),但查詢進行得非常緩慢。 –

+0

我的第一個查詢可能無法使用'uuid'上的索引。嘗試我剛剛添加的第二個查詢。 – Barmar

+0

它在我看到新查詢之前就運行了,所以我出現了所有需要的行。我會仔細檢查一下,如果看起來正確,我會給你答案。 –

相關問題