Avatar billede SommerFyr Seniormester
27. oktober 2022 - 14:32 Der er 13 kommentarer og
1 løsning

Set felt søgning..

Hej Jeg er ved at lave et lille script hvor jeg har lidt problemmer jeg søger lidt hjælp til.

Database
ID | Navn      | Gruppe
1  | Person 1 | A,B,C
2  | Person 2 | A
3  | Person 3 | B
4  | Person 4 | C,B

Ide er at person 1 skal kun se alle og og person 2 skal kun kun se person 1 og samme skal person 3 men person 4 skal kun se person 1 og person 3

jeg har prøve med find_in set men det virker ikke  skal lige site at gruppe er set felt..

håber der er en der kan hjælp mig..
Avatar billede erikjacobsen Ekspert
27. oktober 2022 - 17:02 #1
Hvad betyder A og B og C?
Avatar billede SommerFyr Seniormester
27. oktober 2022 - 17:49 #2
Det er bare et par grupper folk kan være i hvad de heder er i sagen ligyldig
Avatar billede erikjacobsen Ekspert
27. oktober 2022 - 18:47 #3
Ved at kigge lidt mere: person 4 kan se person 1 og 3 fordi er med i samme grupper som person 4. Det ser sådan ud.

Skal du så ud fra en person X se hvilke andre personer som person X kan se, udover sig selv?
Avatar billede erikjacobsen Ekspert
27. oktober 2022 - 19:08 #4
Og det begynder at blive lidt teknisk - et SET er opbevaret som en int, heltal, på max 64 bit.
'A' svarer til 1 decimalt, dvs binært: 001
'B' svarer til 2 decimalt, dvs binært: 010
'A,B' svarer til 3 decimalt, dvs. binært: 011
Og med 'C' som binært 100 er der flere kombinationer. Læs  http://download.nust.na/pub6/mysql/tech-resources/articles/mysql-set-datatype.html for mange, mange detaljer.

Men hvis dit problem er som i mit spørgsmål, så finder du alle dem, som person med id 3 er i gruppe med sådan her:

select * from m where (gruppe & (select gruppe+0 from m where id=3));
Avatar billede SommerFyr Seniormester
27. oktober 2022 - 19:59 #5
Jeg er ikke helt med i din version..

Min table ser sådan ud

CREATE TABLE `person` (
  `PersonID` int(11) NOT NULL,
  `PersonName` varchar(60) NOT NULL,
  `PersonGrupe` set('A','B','C') NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;

og min ide var
SELECT SelectUser.* FROM `person` as SelectUser INNER JOIN `person` as MemberUser ON FIND_IN_SET(MemberUser.`PersonGrupe`,SelectUser.`PersonGrupe`) WHERE MemberUser.`PersonID`='1'

ved godt det ikke lige virker da det jo er det jeg har problem med at bare man opfylder et af de persongrupe ting bliver man sat sammen
Avatar billede erikjacobsen Ekspert
27. oktober 2022 - 20:13 #6
Det kan ikke virke på den måde - altså hvis vi skal finde alle personer som '1' kan se - og ganske utestet:

SELECT SelectUser.* FROM `person` as SelectUser
WHERE (SelectUser.PersonGrupe & (select PersonGrupe+0 from `person` where PersonID=1))

Forklaringen kan man udlede af det link jeg skrev ... hvis man gider.

...og test også med 2,3 og 4.

Men når det er sagt, så er det næsten altid en umanerlig dårlig struktur i en database. Det kan vi vende tilbage til - den rigtigere løsning kræver flere tabeller og mere arbejde.
Avatar billede SommerFyr Seniormester
27. oktober 2022 - 20:19 #7
Fedt det var lige det jeg søger..
Avatar billede SommerFyr Seniormester
27. oktober 2022 - 20:22 #8
Hvordan ville du da lave den ?
Avatar billede erikjacobsen Ekspert
27. oktober 2022 - 20:48 #9
Du har personer og du har grupper. Som standard laver man så en tabel med personer, og en tabel med grupper. Begge har de primær nøgler som de nu skal have.

En person kan så være med i 0, eller 1, eller flere grupper, og det ordner man så med en mellemtabel. Hvis person 7 er medlem af gruppe 9 og 13, så er der 2 rækker i mellemtabellen:

7  9
7  13

Man skal bruge 2 joins mellem de 3 tabeller for at lave forespørgsler som din.

Mere bøvl, men det er relationelle databaser gode til.
Avatar billede SommerFyr Seniormester
27. oktober 2022 - 20:52 #10
Ja det have jeg også overvejer men synde det er lidt spil når det ikke er en stor gruppe men en del personner. ca 13000 personer men ca 3-4 grupper men skifter en del..
Avatar billede erikjacobsen Ekspert
27. oktober 2022 - 21:04 #11
Måske netop når der er mange. Den SELECT-sætning der - heldigvis - ser ud til at virke, kan kun gøre det ved at løbe alle rækker igennem, en TABLE-scan.

Men passende nøgler kan databasen reducere arbejdet.

Nå ja, 13000 er ikke mange. Så længe du er glad ... ;)
Avatar billede SommerFyr Seniormester
27. oktober 2022 - 21:15 #12
Du vil bare lave 3 table

Person

Person_Gruppe

Gruppe

og så join dem eller hvad ?
Avatar billede erikjacobsen Ekspert
27. oktober 2022 - 21:31 #13
Ja, i store træk. Det er en "many-to-many" sammenhæng. der lan realiseres med en mellemtabel. Der er mange artikler på nettet om det, den her ser rimelig ud:  https://dzone.com/articles/how-to-handle-a-many-to-many-relationship-in-datab
Avatar billede SommerFyr Seniormester
27. oktober 2022 - 21:41 #14
Det var også det første jeg tænke på men synde bare det var lidt lige meget i det her. men kan være jeg lige skal se hvad min server siger. ;-)

jeg har lave en del af det anden men tænke det anden var en nemmer løsning.. om den belaster server ved jeg ikke enu..
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