【问题标题】:Combine MySQL IN operator and LIKE结合 MySQL IN 运算符和 LIKE
【发布时间】:2020-05-28 14:38:37
【问题描述】:

如何在 MYSQL 中组合 IN 操作和 LIKE 操作?

就我而言,我想查找包含特定子字符串的重复记录。例如,我有 P123 和 123。我正在删除 P 以查找重复记录 123。然后我想查找 包含 123 的所有记录。

我有以下 MySQL 查询,但我不知道如何添加通配符搜索。

    SELECT *
    FROM table
    WHERE field IN
    (
        SELECT * FROM
        (
            SELECT REPLACE(REPLACE(`field`,'T',''),'P','') as x
            FROM table
            GROUP BY x
            HAVING COUNT(*) > 1
        ) AS subquery
    )

【问题讨论】:

  • 不需要SELECT * FROM 中间子查询。

标签: mysql sql group-by count duplicates


【解决方案1】:

您实际上并不需要通配符。只需在连接列上应用与在 suqbuery 中所做的相同的转换:

SELECT *
FROM table
WHERE REPLACE(REPLACE(`field`,'T',''),'P','') IN (
    SELECT REPLACE(REPLACE(`field`,'T',''),'P','') as x
    FROM table
    GROUP BY x
    HAVING COUNT(*) > 1
)

请注意,如果您运行的是 MySQL 8.0,您也可以使用窗口函数执行此操作,这样可以提供更短的查询并且可能更有效:

SELECT *
FROM (
    SELECT 
        t.*, 
        COUNT(*) OVER(PARTITION BY REPLACE(REPLACE(`field`,'T',''),'P','')) cnt
    FROM table
) t
WHERE cnt > 1

【讨论】:

  • 有时候你只需要换个角度看问题!
【解决方案2】:

您可以使用子查询加入,而不是使用IN

SELECT DISTINCT t1.*
FROM table as t1
JOIN (
    SELECT REPLACE(REPLACE(`field`,'T',''),'P','') as x
    FROM table
    GROUP BY x
    HAVING COUNT(*) > 1
) AS t2 ON t1.field LIKE CONCAT('%', t2.x, '%')

请注意,搜索子字符串意味着它不会匹配确切的数字。如果您要查找包含123 的记录,您将匹配P1234P1123 等。如果您只想匹配完全相同的数字,GMB 的答案会更好(您也可以使用JOIN)。

【讨论】:

    猜你喜欢
    • 2011-12-06
    • 1970-01-01
    • 2013-02-08
    • 1970-01-01
    • 1970-01-01
    • 2011-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多