MySQL Birden çok değer gibi


144

Bu MySQL sorgusu var.

Bu içeriğe sahip veritabanı alanlarım var

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

Neden böyle bir sorgu çalışmıyor? Spor ya da pub ya da her ikisi ile alanları gerekir?

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

Yanıtlar:


133

(a,b,c)Bu liste sadece çalışır in. Bunun için likeşunları kullanmalısınız or:

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

3
Bu, çoklu olarak yararlı olmaz (diyelim ki 5 veya daha fazla dinamik aranabilir sorgu), bu nedenle normal ifadeyi kullanmak daha iyi olur.
Shayan Ahmad

315

Bunu yapmanın daha hızlı yolu:

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

bu:

WHERE interests REGEXP 'sports|pub'

Bu çözümü burada buldum : http://forums.mysql.com/read.php?10,392332,392950#msg-392950

REGEXP hakkında daha fazla bilgi için: http://www.tutorialspoint.com/mysql/mysql-regexps.htm


bilinmeyen miktarda anahtar kelime dizesi (a | b | c ...) olarak geçiyorsanız, regexp, GİBİ yapmak istiyorsanız gitmek için tek yoldur, değil mi?
sık sık

1
Bunun bir alt sorgu ile yapılıp yapılamayacağını biliyor musunuz? Diyelim ki aramam gereken bir kelime sütunum var, 'spor | pub'ı bir alt sorgu ile nasıl değiştirebilirim?
AdamMc331

Hey, bana% LIKE% yerine BENZER gibi
REGEXP

3
Bu çözüm ilkini sudan
Donato

2
Bir sütundan (select group_concat(myColumn separator '|') from..)
normal ifade

34

Neden REGEXP'i denemiyorsunuz? Şöyle deneyin:

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

5
Evet!! Bunun tam tersini istiyorum. Yani SELECT * FROM table WHERE interests NOT REGEXP 'sports|pub' (> ‿◠)

3
Bu yanıtın jazkatsizden 5 yıl önce gönderilen cevaptan farkı nedir?
Vaidas

@Vaidas - teşekkür ederim - kendime aynı soruyu soruyordum ...: D
theFriedC

18

Ayrıca kullanabilirsiniz RLIKE.

Örneğin:

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

6
Sadece RLIKE ve REGEXP'nin eşanlamlı olduğunu unutmayın
Intacto

8

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

Anladığım kadarıyla, ilgi alanlarını masanızın bir alanında saklıyorsunuz, ki bu bir yanlış anlamadır. Kesinlikle bir "ilgi" tablosu olmalıdır.


2
Bence öyle olmalı SELECT * FROM table WHERE find_in_set(interests, 'sports,pub'), ancak bu tekniğin çoğu durumda normalden daha iyi performans göstermesi muhtemeldir.
Chris Strickland

7

Bu işlevi bir ANDparametreden sonra kullanırsanız parantez kullanmayı unutmayın

Bunun gibi:

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


2

@Alexis Dufrenoy'un önerdiği gibi, sorgu şu olabilir:

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

Kılavuzda daha fazla bilgi .


1

Diğer çalışma örnekleri:

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

Görev, e-posta uzantısı birden çok şirket alan adına eşitse, filtreli bir etkinlikteki katılımcıları saydı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.