MySQL Suka beberapa nilai

144

Saya punya permintaan MySQL ini.

Saya memiliki bidang basis data dengan konten ini

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

Mengapa kueri seperti ini tidak berfungsi? Saya membutuhkan bidang dengan olahraga atau pub atau keduanya?

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

Jawaban:

133

The (a,b,c)daftar hanya bekerja dengan in. Karena like, Anda harus menggunakan or:

WHERE interests LIKE '%sports%' OR interests LIKE '%pub%'
Andomar
sumber
3
Ini tidak akan bermanfaat dalam banyak (misalkan 5 atau lebih permintaan dinamis yang dapat dicari), oleh karena itu, akan lebih baik menggunakan regexp.
Shayan Ahmad
315

Cara lebih cepat untuk melakukan ini:

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

Apakah ini:

WHERE interests REGEXP 'sports|pub'

Temukan solusi ini di sini: http://forums.mysql.com/read.php?10,392332,392950#msg-392950

Lebih lanjut tentang REGEXP di sini: http://www.tutorialspoint.com/mysql/mysql-regexps.htm

jazkat
sumber
jika Anda memasukkan jumlah kata kunci yang tidak diketahui sebagai string (a | b | c ...), regexp adalah satu-satunya cara untuk pergi jika Anda ingin melakukan LIKE, bukan?
sering
1
Apakah Anda tahu apakah ini dapat dilakukan dengan subquery? Katakanlah saya memiliki kolom kata yang perlu saya cari, bagaimana saya bisa mengganti 'sports | pub' dengan subquery?
AdamMc331
Hei, bisakah Anda memberi tahu saya REGEXP untuk LIKE daripada% LIKE%, saya mencoba mengambil string yang tepat ...
Deepanshu Goyal
3
Solusi ini meniup yang pertama keluar dari air
Donato
2
Untuk mendapatkan nilai regexp dari kolom:(select group_concat(myColumn separator '|') from..)
daVe
34

Mengapa Anda tidak mencoba REGEXP. Coba seperti ini:

SELECT * FROM table WHERE interests REGEXP 'sports|pub'
Ahmad Hussain
sumber
5
Ya!! Saya ingin sebaliknya. Jadi SELECT * FROM table WHERE interests NOT REGEXP 'sports|pub' (> ‿◠) ✌
Patros
3
Bagaimana jawaban ini berbeda dari jazkatjawaban yang diajukan 5 tahun sebelum jawaban Anda?
Vaidas
@Vaidas - terima kasih - bertanya pada diri sendiri pertanyaan yang sama ...: D
theFriedC
18

Anda juga bisa menggunakannya RLIKE.

Sebagai contoh:

SELECT * FROM TABLE_NAME WHERE COLNAME RLIKE 'REGEX1|REGEX2|REGEX3'
iamharish15
sumber
6
Catat saja untuk semua orang bahwa RLIKE dan REGEXP adalah sinonim
Intacto
8

Kueri Anda seharusnya SELECT * FROM `table` WHERE find_in_set(interests, "sports,pub")>0

Yang saya mengerti adalah bahwa Anda menyimpan minat dalam satu bidang di meja Anda, yang merupakan kesalahpahaman. Anda harus memiliki tabel "minat".

Alexis Dufrenoy
sumber
2
Saya pikir itu harus SELECT * FROM table WHERE find_in_set(interests, 'sports,pub'), tetapi teknik ini cenderung mengungguli regex dalam kebanyakan situasi.
Chris Strickland
7

Jangan lupa untuk menggunakan tanda kurung jika Anda menggunakan fungsi ini setelah ANDparameter

Seperti ini:

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

Seperti yang diusulkan oleh @Alexis Dufrenoy, kueri dapat berupa:

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

Informasi lebih lanjut dalam manual .

Franc Drobnič
sumber
1

Lebih banyak contoh pekerjaan:

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

Tugas adalah menghitung peserta pada suatu acara dengan filter jika ekstensi email sama dengan beberapa domain perusahaan.

Intacto
sumber