MySQL Giống như nhiều giá trị


144

Tôi có truy vấn MySQL này.

Tôi có các trường cơ sở dữ liệu với nội dung này

sports,shopping,pool,pc,games 
shopping,pool,pc,games 
sports,pub,swimming, pool, pc, games   

Tại sao điều này giống như truy vấn không hoạt động? Tôi cần các lĩnh vực với thể thao hoặc quán rượu hoặc cả hai?

SELECT * FROM table WHERE interests LIKE ('%sports%', '%pub%')

Câu trả lời:


133

Các (a,b,c)danh sách chỉ làm việc với in. Đối với like, bạn phải sử dụng or:

WHERE interests LIKE '%sports%' OR interests LIKE '%pub%'

3
Điều này sẽ không có ích trong nhiều (giả sử 5 hoặc nhiều truy vấn có thể tìm kiếm động hơn), do đó, tốt hơn là sử dụng regrec.
Shaya Ahmad

315

Cách nhanh hơn để làm điều này:

WHERE interests LIKE '%sports%' OR interests LIKE '%pub%'

có phải đây là:

WHERE interests REGEXP 'sports|pub'

Tìm thấy giải pháp này tại đây: http://forums.mysql.com/read.php?10.392332,392950#msg-392950

Tìm hiểu thêm về REGEXP tại đây: http://www.tutorialspoint.com/mysql/mysql-regexps.htm


nếu bạn chuyển một lượng từ khóa không xác định dưới dạng một chuỗi (a | b | c ...), thì biểu thức chính là cách duy nhất để đi nếu bạn muốn làm THÍCH, phải không?
thường xuyên

1
Bạn có biết nếu điều này có thể được thực hiện với một truy vấn con? Giả sử tôi có một cột các từ tôi cần tìm kiếm, làm cách nào tôi có thể thay thế 'thể thao | quán rượu' bằng một truy vấn phụ?
AdamMc331

Xin chào, bạn có thể vui lòng cho tôi biết REGEXP cho THÍCH thay vì% THÍCH% không, tôi đang cố gắng tìm nạp các chuỗi chính xác ...
Deepanshu Goyalty 24/03/2015

3
Giải pháp này thổi cái đầu tiên ra khỏi nước
Donato

2
Để nhận giá trị regex từ một cột:(select group_concat(myColumn separator '|') from..)
daVe

34

Tại sao bạn không thử REGEXP. Hãy thử nó như thế này:

SELECT * FROM table WHERE interests REGEXP 'sports|pub'

5
Ừ !! Tôi muốn nó theo cách ngược lại. Vì vậy, nó là SELECT * FROM table WHERE interests NOT REGEXP 'sports|pub' (> ‿◠) ✌
Pha-trốt

3
Câu trả lời này khác với jazkatcâu trả lời được gửi 5 năm trước bạn như thế nào?
Vaidas

@Vaidas - cảm ơn bạn - đã tự hỏi mình câu hỏi tương tự ...: D
theFriedC

18

Bạn cũng có thể dùng RLIKE là tốt.

Ví dụ:

SELECT * FROM TABLE_NAME WHERE COLNAME RLIKE 'REGEX1|REGEX2|REGEX3'

6
Chỉ cần lưu ý cho mọi người rằng RLIKE và REGEXP là từ đồng nghĩa
Intacto

8

Truy vấn của bạn phải là SELECT * FROM `table` WHERE find_in_set(interests, "sports,pub")>0

Điều tôi hiểu là bạn lưu trữ các lợi ích trong một lĩnh vực của bảng của bạn, đó là một quan niệm sai lầm. Bạn chắc chắn nên có một bảng "lãi".


2
Tôi nghĩ rằng nó nên SELECT * FROM table WHERE find_in_set(interests, 'sports,pub'), nhưng kỹ thuật này có khả năng vượt trội hơn regex trong hầu hết các tình huống.
Chris Strickland

7

Đừng quên sử dụng dấu ngoặc đơn nếu bạn sử dụng chức năng này sau một ANDtham số

Như thế này:

WHERE id=123 and(interests LIKE '%sports%' OR interests LIKE '%pub%')


2

Giống như @Alexis Dufrenoy đề xuất, truy vấn có thể là:

SELECT * FROM `table` WHERE find_in_set('sports', interests)>0 OR find_in_set('pub', interests)>0

Thêm thông tin trong hướng dẫn .


1

Ví dụ công việc khác:

SELECT COUNT(email) as count FROM table1 t1 
JOIN (
      SELECT company_domains as emailext FROM table2 WHERE company = 'DELL'
     ) t2 
ON t1.email LIKE CONCAT('%', emailext) WHERE t1.event='PC Global Conference";

Nhiệm vụ được tính người tham gia tại một sự kiện với bộ lọc nếu phần mở rộng email bằng với nhiều tên miền của công ty.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.