2013-02-04 13 views
15

Eventuali duplicati:
mysql join query using like?SQL Entra su una colonna come un altro colonna

voglio fare un join in cui una colonna contiene una stringa dalla colonna di un'altra tabella:

SELECT 
a.first_name, 
b.age 
FROM names a 
JOIN ages b 
ON b.full_name LIKE '%a.first_name%' 

È possibile? Sto usando MySQL. Ovviamente la query precedente non funzionerà poiché LIKE '% a.first_name%' cercherà solo la stringa a.first_name e non il valore effettivo della colonna.

+0

Se si dispone di% all'inizio della stringa, non sarà in grado di utilizzare qualsiasi indice presente nella colonna b.full_name. Ti faccio sapere che la tua performance sarà terribile se hai un database considerevole qui. – Jordan

+0

Otterrai ciò che chiedi però. quindi se il nome è Jo, otterrai josephine, josiline, jobob, jody, joseph ecc. – xQbert

risposta

24

Hai solo bisogno di concatenare le stringhe, potresti anche fare una ricerca e sostituirla.

SELECT 
    a.first_name, 
    b.age 
FROM names a 
JOIN ages b 
ON b.full_name LIKE '%' + a.first_name + '%' 
+5

Funziona meglio con me usando 'ON b.full_name LIKE CONCAT ('%', a.first_name, '%')' – Alcalyn

13

È possibile utilizzare CONCAT:

SELECT 
    a.first_name, 
    b.age 
FROM 
    names a JOIN ages b 
    ON b.full_name LIKE CONCAT('%', a.first_name, '%') 

o anche LOCATE, che restituisce la posizione della prima occorrenza di a.first_name in b.full_name:

SELECT 
    a.first_name, 
    b.age 
FROM 
    names a JOIN ages b 
    ON LOCATE(a.first_name, b.full_name) 

se c'è una corrispondenza, il join avrà successo.

+1

LOCATE() è interessante, sarà sufficiente restituire un valore diverso da zero quando la stringa esiste in b.full_name e restituirà false altrimenti? –

+0

@DonnyP locate restituirà 0 se non c'è corrispondenza o la posizione della prima occorrenza del nome. 0 è considerato equivalente a False, se il valore è> = 1 è considerato True – fthiella

Problemi correlati