2012-04-05 23 views
13

Come useresti 'LIKE' per cercare in una sottoquery?MYSQL usa 'LIKE' nella clausola 'WHERE' per cercare nella subquery

E.g. Ho provato a fare questo, ma non funziona:

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

ho questo finora:

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

che sta funzionando bene come si ritorna esatto di partite, ma non è così sembra di tornare ai miei altri record che sono simili, quindi vorrei controllare anche che:

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

Come sarebbe lo faccio io S?

+0

Quante righe ha il 'myothertable'? – zerkms

+0

solo due piccole correzioni nel codice. 1st remove% e like.Second add in after name, il codice completo è nella mia risposta. –

+0

GRAZIE TUTTO PER LE VOSTRE SPEEDY RISPOSTE COSÌ FAR^_ ^. @zerkms - circa 10 ma questo non influisce in realtà su quello che sto cercando di fare, voglio solo confrontare alcuni campi. – qwerty

risposta

11

Ad esempio:

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

quanto riguarda terminologia va: questo è noto come un subquery correlato.

+1

E se andiamo oltre - ogni subquery in mysql è correlata ;-) (o più preciso: l'ottimizzatore riscrive ogni subquery in una correlata) – zerkms

+2

@zerkms: 'EXISTS' non viene eseguito come subquery correlata –

+0

Ponticini @OMG: Ok, ma non ho detto che lo fa ;-) – zerkms

17

Utilizzo di un join:

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

... ma ci potrebbero essere duplicati, se c'è più di una corrispondenza in myothertable per un dato mytable record.

Utilizzando ESISTE:

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

Utilizzando Full Text Search MATCH (richiede myothertable è MyISAM)

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

+1 per una risposta molto più completa della mia. Vai pony! – bernie

+0

@bernie: Io do le opzioni, ma EXISTS è probabilmente la scelta migliore - tu eri il primo, +1 –

+0

Risposta perfetta. Solo una piccola nota: 'MATCH' probabilmente potrebbe produrre un risultato non previsto in realtà – zerkms

0

modo migliore sarebbe quello di creare funzione chiamata NameMatch()

Domanda finale:

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

La funzione sarà simile:

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

No - questo in realtà eseguirà Row By Agonizing Row (RBAR). SQL è basato su SET ... –

+0

È possibile provare a eseguire in precedenza su MSSQL 2000/2005/2008. Funziona bene. Ho fatto lo stesso. – Dhananjay

+0

"Lavorare" significa "esegue nel modo più efficiente possibile". E la domanda è MySQL, non SQL Server ... –

-1

ha funzionato per me

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

Su MySQL 5.6 questa query genera Error Code: 1242. La sottoquery restituisce più di 1 riga. Su quale versione hai eseguito questo? – Kingz

+0

Gentile Assicurati che la tua subquery restituisca solo un record. altrimenti non funzionerà –

0

SELECT * FROM t1 WHERE t1.name IN (SELECT t2.name da T2) E (t1.title IN (SELECT t2.title da t2) O t1.surname IN (SELECT t2.surname da t2))

0

Solo un altro modo:

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

questa stringa funziona bene per me.

"SELECT * FROM table1 WHERE campo come CONCAT ('%', (ID SELECT FROM tabella2), '%')";

+0

Non funziona se la selezione interna restituisce più di una riga –

Problemi correlati