2013-02-04 41 views
15

thể trùng lặp:
mysql join query using like?SQL Tham gia trên một cột NHƯ cột khác

tôi muốn làm một tham gia, nơi một cột chứa một chuỗi từ cột của bảng khác:

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

Điều này có thể không? Tôi đang sử dụng MySQL. Tất nhiên truy vấn trên sẽ không hoạt động vì LIKE '% a.first_name%' sẽ chỉ tìm chuỗi a.first_name và không phải giá trị thực của cột.

+0

Nếu bạn có% ở đầu chuỗi, nó sẽ không thể sử dụng bất kỳ chỉ mục nào bạn có trên cột b.full_name đó. Chỉ cần cho bạn biết rằng hiệu suất của bạn sẽ khủng khiếp nếu bạn có một cơ sở dữ liệu khá lớn ở đây. – Jordan

+0

Bạn sẽ nhận được những gì bạn yêu cầu. vì vậy nếu tên đầu tiên là Jo, bạn sẽ nhận được josephine, josiline, jobob, jody, joseph vv .. – xQbert

Trả lời

24

Bạn chỉ cần ghép các chuỗi, bạn cũng có thể thực hiện tìm kiếm và thay thế.

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

Hoạt động tốt hơn cho tôi bằng cách sử dụng 'ON b.full_name LIKE CONCAT ('%', a.first_name, '%')' – Alcalyn

13

Bạn có thể sử dụng CONCAT:

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

hoặc cũng LOCATE, mà trả về vị trí của sự xuất hiện đầu tiên của a.first_name trong b.full_name:

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

nếu có một trận đấu, join sẽ thành công.

+1

LOCATE() thú vị, điều đó có trả về giá trị khác không khi chuỗi tồn tại trong b.full_name và trả về false nếu không? –

+0

@DonnyP xác định vị trí sẽ trả về 0 nếu không khớp hoặc vị trí của lần xuất hiện đầu tiên của tên. 0 được coi là tương đương với False, nếu giá trị là> = 1, nó được coi là True – fthiella