[MySQL] Where Abfrage mit Regexp funktioniert nicht richtig

Zero2000

Erfahrenes Mitglied
Hallo,

ich habe mein Anliegen bereits hier gepostet, allerdings ist das Forum komisch, man kann nichtmal andern helfen wenn der Post einen Monat alt ist.

Nun zu meinem Pronlem, ich habe hier ein seltsames Verhalten, welches ich mir nicht erklären kann.
(Das geübte Auge wird erkennen, dass in einer Zelle Kommaseparierte Daten vorhanden sind, ich weis Normalisation - derzeit nicht möglich)
Es geht um nachfolgende Abfrage:

select * from projects where archived = 0 AND project_manager = 1 OR assign_to REGEXP "(^|,)1(,|$)"

Ich habe es auch mal statt mit REGEXP mit OR FIND_IN_SET ('1', assign_to) probiert, aber da ist das gleiche.

Ich bekomme Datensätze, aber eben auch diese wo archived = 1 ist und die will ich doch nicht.

Lasse ich den Teil mit den Regular Expressions oder FIND_IN_SET weg, funktioniert die Abfrage wie sie soll. Habe schon durch Umstellen
der Abfrage versucht dem entgegen zu wirken, aber das hat nicht geklappt. Sieht hier jemand eine Möglichkeit einer
funktionierenden Abfrage?

LG
Maik
 
Lösung
  1. was steht den so in assign_to? Und nach was soll dort drin gesucht werden. Dann kann ich dir acuh sagen, ob der REGEXP() oder der FIND_IN_SET() besser geeignet ist
  2. Die Kombination mit AND und OR ist immer heikel. Setze klammern. Denn a AND (b OR c) ist was anderes als (a AND b) OR c. Ich denke bei dir ist der erste Fall gemeint.
  1. was steht den so in assign_to? Und nach was soll dort drin gesucht werden. Dann kann ich dir acuh sagen, ob der REGEXP() oder der FIND_IN_SET() besser geeignet ist
  2. Die Kombination mit AND und OR ist immer heikel. Setze klammern. Denn a AND (b OR c) ist was anderes als (a AND b) OR c. Ich denke bei dir ist der erste Fall gemeint.
 
Lösung
Danke!!!
Habe die Anfrage nun mit Klammern umgestellt und es funktioniert.
select * from projects where archived = 0 AND (project_manager = 1 OR assign_to REGEXP "(^|,)1(,|$)")

In assign_to steht z.B. 23,1,28,16,13
 
Ich würde FIND_IN_SET(1, assign_to) > 0 verwenden. Ist genau für das gemacht,
Und wenn du unbedingt RegEx nehmen willst, nimm '[[:<:]]1[[:>:]]'. In normalem RegExp währe das \b1\b

Aus der MySQL-Doku
[[:<:]], [[:>:]]
These markers stand for word boundaries. They match the beginning and end of words, respectively. A word is a sequence of word characters that is not preceded by or followed by word characters. A word character is an alphanumeric character in the alnum class or an underscore (_).

Code:
mysql> SELECT 'a word a' REGEXP '[[:<:]]word[[:>:]]';   -> 1
mysql> SELECT 'a xword a' REGEXP '[[:<:]]word[[:>:]]';  -> 0
 
Zurück