MySQL Wie mehrere Werte

144

Ich habe diese MySQL-Abfrage.

Ich habe Datenbankfelder mit diesem Inhalt

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

Warum funktioniert diese Abfrage nicht? Ich brauche die Felder mit Sport oder Pub oder beidem?

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

Antworten:

133

Die (a,b,c)Liste funktioniert nur mit in. Für likemüssen Sie verwenden or:

WHERE interests LIKE '%sports%' OR interests LIKE '%pub%'
Andomar
quelle
3
Dies wäre bei mehreren nicht vorteilhaft (sagen wir 5 oder mehr dynamische durchsuchbare Abfragen), daher ist es besser, regulären Ausdruck zu verwenden.
Shayan Ahmad
315

Schnellere Vorgehensweise:

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

ist das:

WHERE interests REGEXP 'sports|pub'

Diese Lösung finden Sie hier: http://forums.mysql.com/read.php?10,392332,392950#msg-392950

Weitere Informationen zu REGEXP finden Sie hier: http://www.tutorialspoint.com/mysql/mysql-regexps.htm

jazkat
quelle
Wenn Sie eine unbekannte Anzahl von Schlüsselwörtern als Zeichenfolge übergeben (a | b | c ...), ist der reguläre Ausdruck der einzige Weg, wenn Sie LIKE ausführen möchten, oder?
häufig
1
Wissen Sie, ob dies mit einer Unterabfrage möglich ist? Angenommen, ich habe eine Wortspalte, nach der ich suchen muss. Wie kann ich 'sports | pub' durch eine Unterabfrage ersetzen?
AdamMc331
Hey, kannst du mir bitte den REGEXP für LIKE anstelle von% LIKE% sagen? Ich versuche, genaue Zeichenfolgen
abzurufen
3
Diese Lösung bläst die erste aus dem Wasser
Donato
2
Um den regexp Wert aus einer Spalte zu erhalten:(select group_concat(myColumn separator '|') from..)
dave
34

Warum probierst du nicht REGEXP? Versuchen Sie es so:

SELECT * FROM table WHERE interests REGEXP 'sports|pub'
Ahmad Hussain
quelle
5
Ja!! Ich will es umgekehrt. So ist es SELECT * FROM table WHERE interests NOT REGEXP 'sports|pub' (> ‿◠) ✌
Pathros
3
Wie unterscheidet sich diese Antwort von der jazkatAntwort, die 5 Jahre vor Ihrer Antwort eingereicht wurde?
Vaidas
@ Vaidas - danke - stellte mir die gleiche Frage ...: D
theFriedC
18

Sie können auch verwenden RLIKE.

Beispielsweise:

SELECT * FROM TABLE_NAME WHERE COLNAME RLIKE 'REGEX1|REGEX2|REGEX3'
iamharish15
quelle
6
Beachten Sie für alle, dass RLIKE und REGEXP synonym sind
Intacto
8

Ihre Anfrage sollte sein SELECT * FROM `table` WHERE find_in_set(interests, "sports,pub")>0

Ich verstehe, dass Sie die Interessen in einem Feld Ihrer Tabelle speichern, was ein Missverständnis ist. Sie sollten definitiv eine "Interessentabelle" haben.

Alexis Dufrenoy
quelle
2
Ich denke, es sollte so sein SELECT * FROM table WHERE find_in_set(interests, 'sports,pub'), aber diese Technik wird wahrscheinlich in den meisten Situationen Regex übertreffen.
Chris Strickland
7

Vergessen Sie nicht, Klammern zu verwenden, wenn Sie diese Funktion nach einem ANDParameter verwenden

So was:

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

Oder wenn Sie nur den Wortanfang abgleichen müssen:

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

Sie können die regulären Caret-Übereinstimmungen verwenden:

WHERE interests REGEXP '^sports|^pub'

https://www.regular-expressions.info/anchors.html

vadim
quelle
2

Wie von @Alexis Dufrenoy vorgeschlagen, könnte die Abfrage lauten:

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

Weitere Informationen im Handbuch .

Franc Drobnič
quelle
1

Weitere Arbeitsbeispiele:

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

Aufgabe war es, Teilnehmer an einer Veranstaltung mit Filter zu zählen, wenn die E-Mail-Erweiterung mehreren Unternehmensdomänen entspricht.

Intacto
quelle