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?
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)
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, '%')
cette chaîne fonctionne bien pour moi.
"SELECT * FROM table1 WHERE champ comme CONCAT ('%', (SELECT id FROM table2), '%')";
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))
Cela a fonctionné POUR MOI
SELECT *
FROM mytable
WHERE name
LIKE CONCAT('%',(SELECT name FROM myothertable),'%')
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