2013-02-04 14 views
15

Powiel możliwe:
mysql join query using like?SQL Dołącz na kolumnie jak inny kolumnie

chcę zrobić sprzężenie gdzie jedna kolumna zawiera ciąg z kolumny innej tabeli za:

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

Czy to możliwe? Używam MySQL. Oczywiście powyższe zapytanie nie zadziała, ponieważ LIKE "% a.first_name%" będzie po prostu szukało ciągu a.nazwana nazwa, a nie rzeczywistej wartości kolumny.

+0

Jeśli masz% na początku łańcucha, nie będzie on mógł użyć żadnych indeksów, które masz na tej kolumnie b.full_name. Po prostu informuję, że wydajność będzie straszna, jeśli masz sporej bazy danych tutaj. – Jordan

+0

Dostaniesz jednak to, o co prosisz. więc jeśli mam na imię Jo, dostaniesz josephine, josiline, jobob, jody, joseph itd. – xQbert

Odpowiedz

24

Konieczne jest tylko połączenie łańcuchów, można również wyszukiwać i zamieniać.

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

Działa lepiej dla mnie używając 'ON b.full_name LIKE CONCAT ('%', a.pierwsza nazwa, '%')' – Alcalyn

13

Można użyć CONCAT:

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

lub też LOCATE, że zwraca pozycję pierwszego wystąpienia a.first_name w b.full_name:

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

czy jest jakiś mecz, join odniesie sukces.

+1

LOCATE() jest interesujące, czy po prostu zwróci wartość niezerową, gdy łańcuch istnieje w b.full_name, i zwróci false w przeciwnym razie? –

+0

@DonnyP locate zwróci 0, jeśli nie pasuje, lub pozycję pierwszego wystąpienia imienia. 0 jest uważane za równoważne z False, jeśli wartość jest> = 1, jest uważane za True – fthiella