[ Marko Medojević @ 30.06.2009. 15:20 ] @
Ćao!

U tabeli se nalaze slogovi sledećeg tipa:
ID NAZIV OPIS IDROLES
1 aaaaa bbbbb 33;11;2;3;4;6
1 ccccc ddddd 1;2;6;7
...

Kao što vidite, u bazi ne postoji posebna tabela za relaciju(kao što bi trebalo) već su id-ovi rola, odvojeni sa ';' karakterom upisani u jedno polje.
Na koji način da napišem upit koji će mi za određen ID role izvući sve zapise koji imaju dozvolu za tu rolu?

SELECT * FROM tabela1 WHERE IDROLES LIKE '%parID%' mi je nesiguran jer ako tražim za id 11 proćiće i za 111.
[ Nikola Poša @ 30.06.2009. 18:51 ] @
Ne poznajem MySQL baš toliko sa teorijske strane, al' ta tvoja tabela krši prvu normalnu formu (ili možda drugu, ne znam ), al' ako baš hoćeš da uradiš to što ti treba, probaj ovako:
Code:
$sql = "SELECT * FROM tabela WHERE roles_id RLIKE '$roleId;?'"

Al' to je sve prkošenje osnovnim idejama i principima SQL-a.

Znam, bilo bi idealno kad bi u MySQL-u postojao, kao što postoji u PHP-u, neki explode, koji bi vratio niz, pa onda da u njemu radiš neki in_array, al' ja ne znam za takve f-je...
[ Miroslav Ćurčić @ 30.06.2009. 23:37 ] @
Citat:
SELECT * FROM tabela1 WHERE CONCAT(';',IDROLES,';') LIKE '%;parID;%';
[ bogdan.kecman @ 01.07.2009. 05:34 ] @
nikola, u tvom primeru ce opet za trazeno 11 pronaci 111

miroslav, u tvom primeru ako polje ne pocinje sa ; i ne zavrsava se sa ; mozes da promasis prvi ili poslednji id u polju

mare, tu klipersku tabelu normalizuj i to naplati kome god sada prebacujes taj kliper/cobol sistem u sql + sta god inace ce se vratiti da te ujede kad tad ..

ako bas hoces da se maltretiras sa tim .. imas dva nacina .. nijedan ne valja .. jedan je da radis filtriranje na klijentu, mysql ce svakako da radi full table scan i nista nece raditi to filtriranje brze od tebe, a ti ako imas 3 klijenta koji to rade, bolje da oni podele posao nego da mysql radi to sam ... drugi nacin je da to radi mysql .. ako ti pocinju i zavrsavaju se sva polja sa ; onda ti miroslavov upit radi posao, ako ne onda moras malo da prebudzis nikolin upit sa rlike (da dodas (^|;) na pocetak i (;|$) na kraj tako da radi match za "pocetak stringa ili tackazarez" i isto tako za kraj ili tackazarez .. pogledaj manual za rlike kako to tacno da izvedes


e sad .. treci "dobar" nacin bi bio da napises UDF koji bi radio "split" .. pa onda imas nesto tipa:
Code:

SELECT * FROM tabela1 WHERE trazeni_id IN ( split(glupa_kolona) );


proguglaj mozda nadjes takav udf ili stored negde je to sigurno neko vec napisao .. posto lenjih programera i starih kliper baza ima koliko oces
[ Shinhan @ 01.07.2009. 07:14 ] @
Da se koriste zarezi "," umesto tačka zarez ";" mogao bi da koristiš

FIND_IN_SET(11,glupakolona)
[ bogdan.kecman @ 01.07.2009. 07:26 ] @
Citat:
Shinhan: Da se koriste zarezi "," umesto tačka zarez ";" mogao bi da koristiš

FIND_IN_SET(11,glupakolona)


sto je najgore .. mogao bi da uradi nesto tipa

Code:

FIND_IN_SET(11,REPLACE(glupakolona, ';',','))


evo cak i radi :D :D :D

Code:

mysql> select if(FIND_IN_SET(11,REPLACE('1;2;3;4;5;6;7;111;3243', ';',','))>0,'ima','nema') as imanema;
+---------+
| imanema |
+---------+
| nema    | 
+---------+
1 row in set (0.00 sec)

mysql> select if(FIND_IN_SET(111,REPLACE('1;2;3;4;5;6;7;111;3243', ';',','))>0,'ima','nema') as imanema;
+---------+
| imanema |
+---------+
| ima     | 
+---------+
1 row in set (0.00 sec)


[ Marko Medojević @ 01.07.2009. 11:25 ] @
Ljudi hvala vam za ponuđena rešenja! Ipak sam insistirao da se struktura tabela promeni tako da je napravljena još jedna tabela koja će sadržati spoljne ključeve.
Inače, ja sam pre toga došao do sledećeg rešenja za situaciju iz prve poruke:
Code:
SELECT * FROM todo WHERE roles REGEXP '(;2;)|(^2;)|(;2$)|(^2$)'

Broj 2 u upitu je ID.
[ Miroslav Ćurčić @ 01.07.2009. 12:21 ] @
@Bogdan: zato sam i stavio CONCAT(';',IDROLES,';') da obezbedim da počinje i završava sa ;
[ bogdan.kecman @ 01.07.2009. 14:43 ] @
@miroslav, sad sam kreno da ti objasnjavam kako nisi u pravu :D ... sorry .. ti si "glupu kolonu" zagradio sa ; tako da sta god je inicijalno ubaceno like ce vratiti ok vrednost .. odlicna ideja :D mnogo bolje nego ono sa replace :D :D :D

@mare, kazem ti, to je jedino pravo resenje, ono se uvek okrene i ujede te .. posle nedelju, mesec ili dva .. ali odvali parce kad se desi ...