2010-11-13 13 views
99

Ich habe diese MySQL-Abfrage.MySQL Wie mehrere Werte

Ich habe die Datenbankfelder mit diesem Inhalt

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

Warum funktioniert die wie Abfrage nicht funktioniert? Ich brauche die Felder mit Sport oder Pub oder beides?

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

Antwort

89

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

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

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

Was ich verstehe, ist, dass man die Interessen in einem Feld der Tabelle zu speichern, das ein Missverständnis ist. Sie sollten definitiv eine "Zins" -Tabelle haben.

+2

Ich denke, es sollte 'SELECT * FROM Tabelle WHERE find_in_set (Interessen, 'Sport, Pub')' sein, aber diese Technik wird voraussichtlich Regex in den meisten Situationen outperform. –

+0

Sie haben Recht. Ich habe meine Antwort bearbeitet. –

234

Schneller Weg, dies zu tun:

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

ist dies:

WHERE interests REGEXP 'sports|pub' 

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

Mehr über REGEXP hier: http://www.tutorialspoint.com/mysql/mysql-regexps.htm

+28

+1, obwohl nicht schneller in der Laufzeit, aber schneller in Tastenanschläge. – Johan

+0

Wenn Sie eine unbekannte Anzahl von Schlüsselwörtern als Zeichenfolge (a | b | c ...) übergeben, ist die Regexp die einzige Möglichkeit, wenn Sie WIE tun möchten, oder? – frequent

+0

Wissen Sie, ob dies mit einer Unterabfrage gemacht werden kann? Nehmen wir an, ich habe eine Spalte mit Wörtern, nach denen ich suchen muss. Wie kann ich 'sports | pub' durch eine Unterabfrage ersetzen? – AdamMc331

3

Don t vergessen Klammer zu verwenden, wenn Sie diese Funktion nach einem AND Parameter verwenden

So:

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

Warum nicht Sie REGEXP versuchen. Probieren Sie es wie folgt aus:

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

das ist wirklich nett. etwas Neues gelernt. Danke ,, – amrodelas

+0

Dies sollte die akzeptierte Antwort sein. – Mark

+0

Danke Markus, aber sie haben bereits eine andere Antwort akzeptiert :) –

1

Wie @Alexis Dufrenoy vorgeschlagen, die Abfrage SELECT * FROM `table` WHERE find_in_set('sports', interests)>0 OR find_in_set('pub', interests)>0

Weitere Informationen im manual sein könnte.