web-dev-qa-db-fra.com

MYSQL utilise 'LIKE' dans la clause 'WHERE' pour rechercher dans la sous-requête

Comment utiliseriez-vous "LIKE" pour rechercher dans une sous-requête?

Par exemple. j'ai essayé de faire ça, mais ça ne marche pas:

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

J'ai ceci jusqu'à présent:

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))

Cela fonctionne bien car il renvoie des matchs exacts, mais il ne semble pas renvoyer mes autres enregistrements qui sont similaires, donc je voudrais également vérifier que:

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

Comment pourrais-je procéder?

17
qwerty

Utilisation d'un JOIN:

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

... mais il peut y avoir des doublons, s'il y a plus d'une correspondance dans myothertable pour un enregistrement mytable donné.

Utiliser EXISTS:

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

Utilisation de Recherche plein texte MATCH (nécessite myothertable est MyISAM)

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

Par exemple:

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

En ce qui concerne la terminologie: c'est ce qu'on appelle une sous-requête corrélée.

Juste une autre façon:

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

cette chaîne fonctionne bien pour moi.

"SELECT * FROM table1 WHERE champ comme CONCAT ('%', (SELECT id FROM table2), '%')";

0
Leo Barbas

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) DU T2))

0
Bellevue Esaie

Cela a fonctionné POUR MOI

SELECT *
FROM mytable
WHERE name
LIKE CONCAT('%',(SELECT name FROM myothertable),'%')
0
Muhammad Haseeb Khan

La meilleure façon serait de créer une fonction appelée NameMatch ()

Requête finale:

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

La fonction ressemblerait à:

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
0
Dhananjay