Toon posts:

[MySQL/RegExp] Pattern modifiers *

Pagina: 1
Acties:

Verwijderd

Topicstarter
Zit hier te vechten met mysql regexp's, wat ik eigenlijk nodig heb is net zoiets als wat in PHP regexps zit: ungreedy optie of bepaalde lengte van pattern

de volgende string zit in mijn DB:

"678,98,104,531,1"

als ik dan bijv op 1 zou zoeken moet ie dus niet met 3 resultaten terug komen maar met 1 :)

dit heb ik er op de volgende manier geprobeerd uit te halen

PHP:

mysql_query("SELECT * FROM table WHERE row REGEXP '$string{$stringlen}' ");

mysql_query("SELECT * FROM table WHERE row REGEXP '$string' ");

mysql_query("SELECT * FROM table WHERE row REGEXP '^$string' ");

dit is geen van alle uiteraard goed maar kan niks anders vinden in de mysql documentatie of google want die komt alleen aan met php regexp als ik wat gerichter zoek op pattern modifiers

is dit zowiezo mogelijk in mysql ?

[ Voor 13% gewijzigd door Verwijderd op 13-01-2004 12:12 ]


  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

MySQL maakt in ieder geval gebruik van de POSIX extended regexps, dus je kan ook op de PHP-site kijken hoe die in elkaar zitten. Maar wat wil je eigenlijk bereiken? Misschien is het ook anders op te lossen. En je datamodel lijkt mij ook niet echt goed in elkaar zitten als je dit soort dingen moet doen. :)

Sundown Circus


Verwijderd

Topicstarter
mysql maakt toch geen gebruik van posix?! anders ga ik daar natuurlijk even gluren :)

denk zelf dat door het zo opslaan van de string het voor mij het beste uitkomt , ik ga nl niet voor elke gebruiker een nieuwe tabel aanmaken of iets dergelijks

dit string komt erop neer dat elke gebruiker wel een eigen id krijgt + een string vol met andere id's die weer uit een andere tabel komen

maar wat ik dus wil bereiken is dat ik een id geef en dat hij die gaat zoeken in een tabel hoe vaak die voorkomt.

alleen het vervelende is dus zoals ik net als voorbeeld gaf:

als je bijv. een 1 doorgeeft en hij heeft bijv. 561 in zijn string staan, dan matcht hij hem (is op zich goed) maar niet mijn bedoeling!

  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

Uit de manual:
MySQL uses Henry Spencer's implementation of regular expressions, which is aimed at conformance with POSIX 1003.2. MySQL uses the extended version.
en
als je bijv. een 1 doorgeeft en hij heeft bijv. 561 in zijn string staan, dan matcht hij hem (is op zich goed) maar niet mijn bedoeling!
Je kan natuurlijk op die manier checken op het getal dat _tussen_ de komma's staat (of aan het begin of einde van de string).

Sundown Circus


  • kvdveer
  • Registratie: November 2000
  • Laatst online: 06-11-2025

kvdveer

Z.O.Z.

Zoiets ?
code:
1
mysql_query("SELECT * FROM table WHERE row REGEXP '(^|,)$string($|,)' ");


Je moet dan wel even garanderen dan $string geen regexp-karakters bevat.
Als $string = "|.|"; dan matcht hij namelijk iedere niet-lege string.

Localhost, sweet localhost


Verwijderd

Topicstarter
cool dit werkt!

als je een ^ in een subpattern doet kijkt ie niet meer naar de hele string waar je je regexp op loslaat ?

  • kvdveer
  • Registratie: November 2000
  • Laatst online: 06-11-2025

kvdveer

Z.O.Z.

^ betekent "begin van de string". Als je ^ voorin je regexp zet, kijkt 'ie dus alleen aan het begin (dat kan de boel behoorlijk versnellen) In dit geval geef ik aan dat 'ie moet staan aan het begin van de zin of na een komma. Dan gaat het versnellende ballonnetje niet meer op natuulijk, maar het lost wel je probleem op. Een alternatieve, ranzige constructie zou kunnen zijn:
code:
1
mysql_query("SELECT * FROM table WHERE concat(',',row,',') REGEXP ',$string,' ");

Localhost, sweet localhost


Verwijderd

Topicstarter
zoiets had ik dus ook al geprobeerd alleen dan zonder ( ) :)
maar thanx dus :)
Pagina: 1