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

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

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


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'

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'

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.


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


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 .


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.