Avatar billede radiv Nybegynder
02. december 2003 - 17:30 Der er 5 kommentarer og
1 løsning

Hente værdier ud fra feltnavn af type set

Jeg har en tabel med en terminliste, hvor et af felterne angiver hvem der er medvirkende til et givet arrangement. Datatypen er SET, og værdierne er på formatet 'alle deltagere','deltager 1','deltager 2' osv. Et arrangement kan have en eller flere medvirkende.

Jeg ønsker at lave en liste der jeg kan hente alle poster der indeholder fx 'deltager 1' og 'alle deltagere'. Med:

SELECT * FROM `terminliste` WHERE FIND_IN_SET('deltager 1',`medvirkende`)

får jeg en liste med de arrangement der 'deltager 1' er med. Men hvordan returnere en liste når kriteriet er 'alle deltagere' OG 'deltager 1'?
Avatar billede detox Nybegynder
02. december 2003 - 18:48 #1
Du skal regne med at dine værdier i et SET felt osse er repræsenteret binært, så du kan spørge sådan her:

SELECT * FROM `terminliste` WHERE tal & (1+2) = (1+2) AND
tal & ( 4 + 8 + 16 + 32 + 64 ) = 0

alt afhængig af hvor mange værdier du har i SET selvfølgelig.
Avatar billede radiv Nybegynder
02. december 2003 - 21:43 #2
OK, jeg tror jeg forstår ideen, men jeg vil nu gerne få det skåret ud i pap...

Jeg har 16 værdier i SET, så hvordan spørger jeg hvis jeg vil have alle forekomster der værdi 1 eller værdi 2 er med?
Avatar billede detox Nybegynder
02. december 2003 - 21:56 #3
En mulighed er:

SELECT * FROM `terminliste` WHERE FIND_IN_SET('alle deltagere',`medvirkende`) AND
FIND_IN_SET('deltager 1',`medvirkende`)

Med den binære metode, vil det se sådan ud:

SELECT * FROM `terminliste` WHERE medvirkende & 3 = 3 AND
medvirkende & (4+8+16+32+64+128+256+512+1024+2048+4096+8192+16384+32768) = 0

Hvis min hovedregning ikke fejler, her vil jeg nu nok foretrække den første metode ;o)
Avatar billede detox Nybegynder
02. december 2003 - 22:06 #4
Men den binære tilgang kan være god fx hvis du vil indsætte en del deltagere, kan du udregne den binære værdi ved eks:
Du skal indsætte 'alle deltagere, 'deltager 5', 'deltager 9' og 'deltager 12'.
2^0 + 2^5 + 2^9 + 2^12 = 4641. Så indsætter du blot 4641 i medvirkende.
På samme måde kan du tilføje fx 'deltager 11' ved at opdatere din tabel med 2^11:
UPDATE terminliste SET medvirkende & 2048 WHERE betingelse.
Avatar billede radiv Nybegynder
02. december 2003 - 22:21 #5
Tak, jeg valgte den første løsning, da den er mere læselig og jeg uanset kommer til at kalde dem med navn, og ikke med position.

Men jeg ser fidusen med den binære tilgang til SET med flere værdier.

Post et svar, så får du dine points.
Avatar billede detox Nybegynder
02. december 2003 - 22:22 #6
Velbekommen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester