Объедините MySQL IN оператора и LIKE - PullRequest
1 голос
/ 13 февраля 2020

Как объединить операцию IN и операцию LIKE в MYSQL?

В моем случае я хочу найти повторяющиеся записи, содержащие определенную подстроку. Например, у меня есть 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
    )

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

Тебе не нужен подстановочный знак. Просто примените то же преобразование к объединенному столбцу, что и в 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
0 голосов
/ 13 февраля 2020

Вы можете присоединиться к подзапросу вместо использования 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, вы будете соответствовать P1234, P1123, et c. Если вы хотите совпадать только с одним и тем же числом, ответ GMB будет лучше (вы также можете сделать это с помощью JOIN).

...