MySQL ชอบหลายค่า


144

ฉันมีแบบสอบถาม MySQL นี้

ฉันมีฟิลด์ฐานข้อมูลพร้อมเนื้อหานี้

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

เหตุใดข้อความค้นหาเช่นนี้จึงไม่ทำงาน ฉันต้องการฟิลด์ที่มีทั้งกีฬาหรือผับหรือทั้งสองอย่าง?

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

คำตอบ:


133

รายการเท่านั้นทำงานร่วมกับ(a,b,c) inสำหรับlikeคุณต้องใช้or:

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

3
สิ่งนี้จะไม่เป็นประโยชน์ในหลาย ๆ รายการ (สมมติว่ามีข้อความค้นหาแบบไดนามิกที่ค้นหาได้มากกว่า 5 ข้อ) ดังนั้นควรใช้ regexp ดีกว่า
Shayan Ahmad

315

วิธีที่เร็วกว่าในการทำสิ่งนี้:

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

นี่คือ:

WHERE interests REGEXP 'sports|pub'

พบวิธีแก้ปัญหาที่นี่: http://forums.mysql.com/read.php?10,392332,392950#msg-392950

เพิ่มเติมเกี่ยวกับ REGEXP ที่นี่: http://www.tutorialspoint.com/mysql/mysql-regexps.htm


หากคุณผ่านจำนวนคำหลักที่ไม่รู้จักเป็นสตริง (a | b | c ... ), regexp เป็นวิธีเดียวที่จะไปหากคุณต้องการทำ LIKE ใช่ไหม?
บ่อย

1
คุณรู้หรือไม่ว่าสิ่งนี้สามารถทำได้ด้วยแบบสอบถามย่อยหรือไม่? สมมติว่าฉันมีคอลัมน์ของคำที่ฉันต้องการค้นหาฉันจะแทนที่ 'sports | pub' ด้วยข้อความค้นหาย่อยได้อย่างไร
AdamMc331

เฮ้คุณช่วยบอก RegEXP ให้ LIKE แทน% LIKE% ได้ไหมฉันพยายามดึงสตริงที่แน่นอน ...
Deepanshu Goyal

3
วิธีแก้ปัญหานี้พ่นน้ำออกจากน้ำครั้งแรก
Donato

2
ในการรับค่า regexp จากคอลัมน์:(select group_concat(myColumn separator '|') from..)
daVe

34

ทำไมคุณไม่ลอง REGEXP ลองแบบนี้:

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

5
ใช่!! ฉันต้องการมันในทางตรงกันข้าม ดังนั้นจึงเป็นSELECT * FROM table WHERE interests NOT REGEXP 'sports|pub' (> ‿◠) ✌
Pathros

3
คำตอบนี้แตกต่างจากjazkatคำตอบที่ส่งมา 5 ปีก่อนคุณอย่างไร
Vaidas

@Vaidas - ขอบคุณ - ถามตัวเองด้วยคำถามเดียวกัน ... : D
theFriedC

18

คุณยังสามารถใช้RLIKEเช่นกัน

ตัวอย่างเช่น:

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

6
เพียงทราบสำหรับทุกคนที่ RLIKE และ REGEXP เป็นคำพ้องความหมาย
Intacto

8

คำถามของคุณควรเป็น SELECT * FROM `table` WHERE find_in_set(interests, "sports,pub")>0

สิ่งที่ฉันเข้าใจคือคุณเก็บผลประโยชน์ไว้ในฟิลด์เดียวของตารางซึ่งเป็นความเข้าใจผิด คุณควรมีตาราง "ความสนใจ" อย่างชัดเจน


2
ฉันคิดว่ามันควรจะเป็นSELECT * FROM table WHERE find_in_set(interests, 'sports,pub')แต่เทคนิคนี้น่าจะมีประสิทธิภาพสูงกว่า regex ในสถานการณ์ส่วนใหญ่
Chris Strickland

7

อย่าลืมใช้วงเล็บถ้าคุณใช้ฟังก์ชั่นนี้หลังจากANDพารามิเตอร์

แบบนี้:

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


2

เช่นเดียวกับ @Alexis Dufrenoy เสนอแบบสอบถามอาจเป็น:

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

ข้อมูลเพิ่มเติมได้ในคู่มือ


1

ตัวอย่างงานเพิ่มเติม:

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";

ภารกิจมีการนับผู้เข้าร่วมในกิจกรรมด้วยตัวกรองหากส่วนขยายอีเมลเท่ากับโดเมนหลาย บริษัท

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.