Подтвердить что ты не робот

MYSQL использует "LIKE" в предложении "WHERE" для поиска в подзапросе

Как вы могли бы использовать "LIKE" для поиска в подзапросе?

например. я пробовал делать это, но не работает:

SELECT *
FROM mytable
WHERE name
    LIKE '%
        (SELECT name FROM myothertable)
        %'

У меня это до сих пор:

SELECT * FROM t1
WHERE t1.name IN (SELECT t2.name FROM t2)
AND (t1.title IN (SELECT t2.title FROM t2)
    OR t1.surname IN (SELECT t2.surname FROM t2))

Он работает нормально, так как он возвращает точные соответствия, но, похоже, он не возвращает другие мои записи, которые похожи, поэтому я хотел бы также проверить, что:

t1.title LIKE '% t2.title%' И t1.surname LIKE '% t2.surname%'

Как мне это сделать?

4b9b3361

Ответ 1

Использование JOIN:

SELECT a.*
  FROM mytable a
  JOIN myothertable b ON a.name LIKE CONCAT('%', b.name, '%')

... но могут быть дубликаты, если в myothertable имеется более одного совпадения для данной записи mytable.

Использование EXISTS:

SELECT a.*
  FROM mytable a
 WHERE EXISTS (SELECT NULL 
                 FROM myothertable b 
                WHERE a.name LIKE CONCAT('%', b.name, '%'))

Использование Полнотекстового поиска MATCH (требуется myothertable - MyISAM)

SELECT a.*
  FROM mytable a
  JOIN myothertable b ON MATCH(a.name) AGAINST (b.name)

Ответ 2

Например:

SELECT a_column
FROM   mytable t
WHERE  EXISTS (
           SELECT 1
           FROM   myothertable ot
           WHERE  t.`name` LIKE '%' || ot.`name` || '%');

Что касается терминологии: это называется коррелированным подзапросом.

Ответ 3

Лучший способ - создать функцию NameMatch()

Окончательный запрос:

SELECT * FROM mytable  WHERE dbo.NameMatch(name) = 1  

Функция будет выглядеть так:

create function dbo.NameMatch 
(@_name varchar(100))
returns bit 
as  begin

    declare @res bit 
    if exists (select 1 from myothertable where @_name like '%' + name + '%' )
     set @res = 1
    else set @res  = 0
    return @res

end

Ответ 4

SELECT * FROM t1 WHERE t1.name IN (SELECT t2.name FROM t2) И (t1.title IN (SELECT t2.title FROM t2)   ИЛИ t1.surname IN (SELECT t2.surname FROM t2))

Ответ 5

Еще один способ:

select a.field, b.code
from table1 a 
inner join (select code from table2 where ....) b on a.field like CONCAT('%', b.code, '%')

Ответ 6

Он работал у меня

SELECT *
FROM mytable
WHERE name
LIKE CONCAT('%',(SELECT name FROM myothertable),'%')

Ответ 7

эта строка отлично работает для меня.

"SELECT * FROM table1 WHERE, как CONCAT ('%', (SELECT id FROM table2), '%')";