【问题标题】:Fetching all columns where column X is unique from MySQL database table从 MySQL 数据库表中获取列 X 唯一的所有列
【发布时间】: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


    【解决方案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 散列来识别,因为该版本没有唯一的 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
    

    【讨论】:

    • 工作也...我想出了以下SELECT * FROM (SELECT *, COUNT(md5) AS md5Check FROM source_files GROUP BY md5 HAVING md5Check = 1) as preFiltered GROUP BY version ORDER BY version 谢谢。对多文件检查有什么想法吗?
    • 答案已编辑。不确定这是否是您的工作场景。
    • Mh.我真的不知道...我需要使用仅适用于单个版本的路径和 md5 组合来获取行。我想我需要遍历所有行并为要检查的第二个文件创建一个子查询。检查更新上面的示例数据:版本 1.2.3。没有唯一的 MD5,但可以通过检查文件一和文件二来识别。我的查询结果应返回所需的文件以检查以识别版本。所以在这种情况下my/path/to/file E68CC0233A1719A17CDF5D7CFB9539A8 1.2.3和my/path/to/file2 884F676DE41CB35951322B98654E046C 1.2.3
    【解决方案2】:

    你应该有主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
    

    【讨论】:

    • 似乎返回所有行...得到它与SELECT * FROM (SELECT *, COUNT(md5) AS md5Check FROM source_files GROUP BY md5 HAVING md5Check = 1) as preFiltered GROUP BY version ORDER BY version一起工作
    猜你喜欢
    • 2013-05-06
    • 2014-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多