【发布时间】:2017-05-02 09:42:22
【问题描述】:
我被我的 MySQL 语句卡住了。我有一个巨大的数据库表(140.000 行),其中包含文件路径、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
my/path/to/file E68CC0233A1719A17CDF5D7CFB9539A8 1.2.4
因此版本 1.2.2 可以通过文件和哈希轻松识别,因为该文件的 MD5 值是唯一的。
现在我需要该查询的 SQL 语句。我尝试过使用 DISTINCT,使用 HAVING COUNT 和 GROUP BY。但根本没有成功。其实我又开始了
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 哈希来识别,因为该版本没有唯一的 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”来识别
【问题讨论】:
标签: php mysql sql unique distinct