WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Söka med mysql's egna variabler (https://www.wn.se/forum/showthread.php?t=1053930)

linus1 2012-06-25 17:58

Söka med mysql's egna variabler
 
Hej,

Har följande query:

select u.id from menu m, userroles u where m.group_id = '$group_id' && m.name = 'service_do_service' && u.pages LIKE %(m.id)%

Det är den sista biten jag har problem med... jag får inte till det att söka i "u.pages" med %m.id%.

Vad ska jag skriva där ?

Tack på förhand.

emilv 2012-06-25 18:05

Kod:

LIKE CONCAT('%(', m.id, ')%')
Men tänk på att detta är rätt långsamt. Jag tycker det ser ut som att du valt att spara flera värden i ett enda fält, något relationsdatabasmodellen inte är tänkt för. Du strider mot första normalformen

linus1 2012-06-25 18:09

Citat:

Ursprungligen postat av emilv (Inlägg 20443378)
Kod:

LIKE CONCAT('%(', m.id, ')%')
Men tänk på att detta är rätt långsamt. Jag tycker det ser ut som att du valt att spara flera värden i ett enda fält, något relationsdatabasmodellen inte är tänkt för. Du strider mot första normalformen

Tack för svaret!

"Du strider mot första normalformen" förstår jag inte..?


i userroles->pages är det en massa sidor som du får tillgång till genom att sidans "menu"-id är inlagd där med : som separator.

Har du något bättre förslag att lösa det (utan att skapa en kolumn för varje sida i userroles)?

linus1 2012-06-25 18:19

Test
 
Testade nu:

select u.id from menu m, userroles u where m.group_id = '1' && m.name = 'service_do_service' && u.pages LIKE CONCAT('%(', m.id ,')%')

Dock resulterar det i 0 rader. byter jag ut m.id till 13 (id:t som den ska köra där) så träffar jag två rader.

Något som har ett förslag?

emilv 2012-06-25 18:30

För att din databasdesign ska uppfylla första normalformen krävs att du bara lagrar ett värde per fält. Genom att bryta mot denna regel gör du det svårt för dig själv att skapa vettiga SQL-frågor. Rätt sätt att skapa en många-till-många-relation är att skapa en till tabell där varje rad kopplar en rad i den ena tabellen till en rad i den andra. Sedan JOIN:ar man alla tre.

Med din nuvarande design kan databasmotorn inte optimera frågan överhuvudtaget. Har du många radera i någon av tabellerna kan du få potentiellt horribel prestanda. Med en normaliserad design kan MySQL lätt använda eventuella index och annat. Dessutom är en heltalsjämförelse betydligt billigare än en LIKE-jämförelse.

Jag förstår dock inte varför du inte får någon träff med mitt förra svar. Kan det vara på grund av parenteserna? Har du parenteser i fältet? Kan du visa ett utdrag ur båda tabellerna?

linus1 2012-06-25 18:48

4 bifogad(e) fil(er)
Då ska vi se..

bild 2-3: Min nuvarande databas.

bild 1: Detta systemet vill jag inte ha,.

bild 4: är det så här du menar med "ditt" system?


Alla tider är GMT +2. Klockan är nu 07:10.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson