从MySQL数据库表中获取列X唯一的所有列

时间:2017-05-02 09:42:22

标签: php mysql sql unique distinct

我对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;

2 个答案:

答案 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都是字段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

答案 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