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%')

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%'

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


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'

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'

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


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%')


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 .


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.