我被我的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」
似乎返回所有行......心動不如用'選擇工作* FROM(SELECT *,COUNT( md5)AS md5Check FROM source_files GROUP BY md5 HAVING md5Check = 1)as preFiltered GROUP BY version ORDER BY version' –