web-dev-qa-db-ja.com

MYSQLは「WHERE」句で「LIKE」を使用してサブクエリを検索します

どのように「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%' AND t1.surname LIKE '%t2.surname%'

どうすればよいですか?

17
qwerty

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)
23
OMG Ponies

例えば:

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

用語に関する限り、これは相関サブクエリと呼ばれます。

ちょうど別の方法:

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

この文字列は私には問題ありません。

"SELECT * FROM table1 WHEREフィールドのような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からt2))

0
Bellevue Esaie

それは私のために働いた

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

最良の方法は、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
0
Dhananjay