我对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,使用GROUP BY进行HUNTING 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哈希,它应该得到"测试"对于两个文件,或三个文件,或四个......因为版本中有一个unqiuie文件/ 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&#34;文件&#34;和第4&#34; file2&#34;
答案 0 :(得分: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都是字段path
和MD5
的组合。有关多列作为主键here或here的表格的详细信息。
在这种情况下,您可以更改以前的查询以及多列上的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
答案 1 :(得分:0)
您应该拥有主要身份证件
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