2013-10-15 59 views
1

我有二元這些字符串數據庫如何在mysql數據庫中找到類似的二進制字符串?

record no 1: 1111111111111011000100110001100100010000000000000011000000000000 
record no 2: 1111111111111111111111100001100000010000000000000011000000000000 
record no 3: 1110000011110000111010001110111011110000111100001100000011000000 
... 

所以,我想找出什麼記錄也有類似的二進制字符串與此:1111111111111011000100110001100100010000000000000011000000001100

可以看到,記錄編號1爲98%的相關性。 記錄編號2是70%相關性,記錄編號3只有45%相關性。

這是龐大的數據庫(200,000條記錄)...

+0

看看這個SO問題:http://stackoverflow.com/questions/4777070/hamming-distance-on-binary-strings-in-sql – Bjoern

+0

@Bjoern你能幫我完成mysql查詢嗎?我已經閱讀過了,但我仍然不知道如何查詢 – TomSawyer

+0

那麼,如果您改編了那裏提供的函數,那麼您的選擇查詢將會看起來像'SELECT HUMMINGDISTANCE(some_parameter)FROM yourtable;'。作者將二進制字符串轉換爲大整數以實現性能,所以您應該在爲函數提供參數的同時進行調整。他還使用了32個字節,你已經考慮到了你的二進制值。 – Bjoern

回答

1
SELECT * FROM MY_TABLE ORDER BY BIT_COUNT(CAST(CONV(record,2,10) as unsigned integer)^CAST(b'11...0' as unsigned integer)) LIMIT 1; 

上面的查詢將返回最相似的記錄。

您也可以選擇BIT_COUNT,它的最小值= 0表示標識(記錄=輸入)或100%,最大= 64表示所有位不同(記錄=〜輸入)或0%。

+0

剛剛嘗試過您的查詢,但我在這裏看不到相關的訂單。如果字段類型是BIGINT,我不能將完整的字符串存儲到數據庫。我使用varchar。這裏是我的查詢: SELECT * 從文件中 ORDER BY BIT_COUNT(哈希^ 1110000011110000111010001110111011110000111100001100000011000000) LIMIT 0,30 – TomSawyer

+0

那麼,它僅適用於整數,你將不得不記錄轉換爲BIGINT和你的輸入值長。 –

+0

您可以嘗試用BINARY(記錄)替換記錄,並將輸入選擇爲b'1100 ...'。但我不確定是否可以使用BINARY轉換。 –

相關問題