MYSQL utiliser' LIKE 'dans' WHERE ' clause pour rechercher dans subquery
comment utiliseriez-vous' LIKE ' pour rechercher dans un sous-jeu?
E. g. j'ai essayé de le faire, mais ne fonctionne pas:
SELECT *
FROM mytable
WHERE name
LIKE '%
(SELECT name FROM myothertable)
%'
j'ai ceci:
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))
Ça fonctionne ok, de retour exacte de matchs, mais il ne semble pas retourner mes autres enregistrements qui sont semblables, donc je voudrais aussi vérifier que:
t1.titre comme " % t2.titre% " et t1.nom de famille comme ' % t2.nom de famille%'
Comment puis-je faire?
7 réponses
utilisation D'une jointure:
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 mytable
enregistrement.
Using EXISTS:
SELECT a.*
FROM mytable a
WHERE EXISTS (SELECT NULL
FROM myothertable b
WHERE a.name LIKE CONCAT('%', b.name, '%'))
en utilisant Recherche En Texte Intégral MATCH
(il faut myothertable
is 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` || '%');
pour ce qui est de la terminologie: c'est ce qu'on appelle une sous-espèce corrélée.
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 :
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
Il a Travaillé POUR MOI
SELECT *
FROM mytable
WHERE name
LIKE CONCAT('%',(SELECT name FROM myothertable),'%')
sélectionner * à partir de t1 Où t1.nom dans (sélectionnez t2.nom du t2) Et (t1.titre (sélectionnez t2.titre de t2) Ou t1.nom de famille (sélectionnez t2.nom de famille de t2))
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 très bien pour moi.
"SELECT * FROM table1 WHERE field like CONCAT (' %', (SELECT id FROM table2), '%')";