2017-05-02 79 views
0

我被我的MySQL語句卡住了。我有一個龐大的數據庫表(140.000行),包含文件路徑,MD5散列和代碼版本。現在我想獲取可以基於特定文件的MD5哈希標識版本的行。從MySQL數據庫表中獲取列X唯一的所有列

喜歡的東西,這些

Path     MD5         Version 
---------------------------------------------------------------------------- 
my/path/to/file   12B9DA49A62D8E7B21B5AA2C6C3126CB 1.2.0 
my/path/to/file   12B9DA49A62D8E7B21B5AA2C6C3126CB 1.2.1 
my/path/to/file   FDA9A7D31ECC70F99D533D88F9EDE441 1.2.2  
my/path/to/file   E68CC0233A1719A17CDF5D7CFB9539A8 1.2.3 
my/path/to/file   E68CC0233A1719A17CDF5D7CFB9539A8 1.2.4 

所以版本1.2.2可以很容易被通過的文件和哈希因爲對這個文件的MD5值identifed是獨一無二的。

現在我需要該查詢的SQL語句。我嘗試過使用DISTINCT,並使用GROUP BY與HAVING COUNT。但沒有成功。其實我一開始再次

SELECT DISTINCT 
    md5 
FROM 
    source_files 
    INNER JOIN (
    SELECT 
    * 
    FROM 
     source_files 
) subq ON source_files.md5 = subq.md5 

,因爲我需要的所有列,而不是僅得到由SELECT DISTINCT md5 FROM source_files返回的MD5列。但是這也會引發錯誤。另外我需要group by version,因爲我只需要一個組合/版本來識別它。

多文件檢查

另外一個新的水平將是:如果一個版本沒能鑑定通過獨特的MD5哈希值,因爲對於該版本應該得到「測試」沒有unqiue MD5哈希反對兩個文件或三個文件,或四個...因爲對於某個版本,文件/ MD5哈希值是一個非常可靠的組合。

這裏多文件檢查更新的例子

Path     MD5         Version 
---------------------------------------------------------------------------- 
my/path/to/file   12B9DA49A62D8E7B21B5AA2C6C3126CB 1.2.0 
my/path/to/file   12B9DA49A62D8E7B21B5AA2C6C3126CB 1.2.1 
my/path/to/file   FDA9A7D31ECC70F99D533D88F9EDE441 1.2.2  
my/path/to/file   E68CC0233A1719A17CDF5D7CFB9539A8 1.2.3 <- same file 
my/path/to/file   E68CC0233A1719A17CDF5D7CFB9539A8 1.2.4 <- same file 

my/path/to/file2  884F676DE41CB35951322B98654E046C 1.2.0 <- same file 
my/path/to/file2  884F676DE41CB35951322B98654E046C 1.2.1 <- same file 
my/path/to/file2  884F676DE41CB35951322B98654E046C 1.2.2 <- same file 
my/path/to/file2  884F676DE41CB35951322B98654E046C 1.2.3 <- same file 
my/path/to/file2  3182B2BEDDB1F798F66D27425B9F99D9 1.2.4 
my/path/to/file2  3182B2BEDDB1F798F66D27425B9F99D9 1.2.5 

所以1.2.3版可以通過4「文件」和第4「文件2」

回答

0

得到確定你應該有主ID

select 
    ID, 
    PATH, 
    MD5, 
    Version 
from source_files LEFT JOIN 
(
    select *, count(MD5) count from source_files group by MD5 
) sf on sf.ID = source_files.ID having sf.count = 1 
+0

似乎返回所有行......心動不如用'選擇工作* FROM(SELECT *,COUNT( md5)AS md5Check FROM source_files GROUP BY md5 HAVING md5Check = 1)as preFiltered GROUP BY version ORDER BY version' –

1
SELECT * FROM source_files 
INNER JOIN (
    SELECT MD5, COUNT(1) AS CountOf 
    FROM source_files 
    GROUP BY MD5 
) tbl 
ON source_files.MD5=tbl.MD5 
WHERE tbl.CountOf = 1 

編輯。 超越:

如果版本沒能由唯一的MD5哈希鑑定,因爲對於該版本應該得到「測試」對兩個文件,三個文件,或四無unqiue MD5哈希值。 ..因爲一個版本有一個unqiuie文件/ MD5散列組合。

然後,它看起來像source_files表的PK是結合這兩個領域pathMD5。有關多列作爲主鍵的表格的詳細信息herehere

在這種情況下,你可以改變之前的查詢和GROUP BY多個列(細節here):

SELECT * FROM source_files 
INNER JOIN (
    SELECT MD5, COUNT(1) AS CountOf 
    FROM source_files 
    GROUP BY path, MD5 
) tbl 
ON source_files.MD5=tbl.MD5 
WHERE tbl.CountOf = 1 
+0

Working also ...我想出以下'SELECT * FROM(SELECT *,COUNT(md5)AS md5Check FROM source_files GROUP BY md5 HAVING md5Check = 1)作爲preFiltered GROUP BY版本ORDER BY版本'謝謝。 有關多文件檢查的任何想法? –

+0

編輯答案。不知道這是你的工作場景。 – MarcM

+0

Mh。我真的不知道......我需要使用僅適用於單個版本的pathes和md5組合獲取行。我想我需要遍歷所有行併爲第二個文件創建一個子查詢來檢查。 檢查更新上面的示例數據:版本1.2.3。沒有唯一的MD5,但可以通過檢查文件一和文件二來識別。我的查詢結果應該返回所需的文件來檢查以確定版本。因此,在這種情況下,我的/路徑/到/文件E68CC0233A1719A17CDF5D7CFB9539A8 1.2.3'和'我/路徑/到/文件2 884F676DE41CB35951322B98654E046C 1.2.3' –

相關問題