Avatar billede AnyFellow Mester
27. november 2010 - 13:58 Der er 11 kommentarer og
1 løsning

Hente brugere fra tabel, med ekstra kolonne betinget af anden tabel

Hej

Jeg er i en situation, hvor jeg skal have en liste over alle mine brugere, med angivelse af hvem der er medlem af en bestemt gruppe og hvem der ikke er.

I første omgang brugte jeg denne forespørgsel, der hente alle brugere der er medlemmer af gruppen:

<div>
SELECT user.user_id, user.firstname, user.lastname, user.user_name
FROM cms_user_rights AS rights, cms_user AS user
WHERE rights.user_id = user.user_id
AND rights.group_id = '1';
</div>

Hvordan er det jeg henter en komplet liste over mine brugere, og i forespørgslen får tilføjet en kolonne, der angiver om de er medlem af gruppen eller ej?
Avatar billede AnyFellow Mester
27. november 2010 - 14:41 #1
Jeg er tættere på målet, men ikke helt i mål med denne:
SELECT user.user_id, user.firstname, user.lastname, user.user_name, IF (rights.group_id = 2, 'yes', 'no') AS member
FROM cms_user AS user, cms_user_rights AS rights
WHERE rights.user_id = user.user_id;

Nu får jeg en liste over alle brugere, men desværre nogle af dem dobbelt, hvilket skyldes at de er medlemmer af flere
27. november 2010 - 14:48 #2
Dit spoergsmaal kan forstaas paa to maader, enten (1) en liste af alle brugere fra alle grupper med angivelse af hvilke grupper de er i, eller (2) en angivelse af alle brugere med group_id=1 hvor group_id'en staar.

Jeg vil foreslaa at du forbinder tabellerne med JOIN i stedet for med WHERE, saaledes:

(1)SELECT u.user_id, u.firstname, u.lastname, u.user_name, r.group_id
FROM cms_user AS u LEFT JOIN cms_user_rights r ON u.user_id = r.user_id

eller (2) SELECT u.user_id, u.firstname, u.lastname, u.user_name, r.group_id
FROM cms_user AS u LEFT JOIN cms_user_rights r ON u.user_id = r.user_id
WHERE r.group_id = 1
27. november 2010 - 14:49 #3
Jeg saa ikke dit indlaeg foer jeg sendte mit.  Jeg kikker lige paa det.
27. november 2010 - 14:52 #4
Du vil altsaa have liste af alle brugere plus tilkendegivelse af om de tilhoerer en bestemt gruppe (i dette tilfaelde gruppe 2) eller ej.  Proev at tilfoeje DISTINCT for at undgaa duplikater, altsaa SELECT DISTINCT user.user_id......
Avatar billede AnyFellow Mester
27. november 2010 - 14:56 #5
Det har jeg prøvet, og alle rækker der vises er "DISTINCT". Så vidt jeg kan se er det ikke distinct på det enkelte felt, og derfor vises brugere både med "no" og "yes".
Avatar billede AnyFellow Mester
27. november 2010 - 14:57 #6
Jeg bruger ofte join, men i det her tilfælde har det vel ikke en betydning om jeg bruger join eller ej?
27. november 2010 - 15:39 #7
Jamen saa lad mig proeve igen, vi finder en loesning, men det bliver i aften da jeg er lidt haengt op.
Avatar billede AnyFellow Mester
27. november 2010 - 15:44 #8
Det er fint nok med mig.
27. november 2010 - 19:10 #9
Saa er jeg med igen.  For at teste de foelgende ideer lavede jeg to tabeller, kfisker_user med felterne user_id og firstname, og kfisker_rights med felterne user_id og group_id.  Saa oprettede jeg i kfisker_user fire brugere, og i kfisker_rights arrangerede jeg det saa bruger 1 og 2 er medlem af gruppe 2 og andre grupper, bruger 3 er ikke medlem af nogen gruppe, og bruger 4 er medlem af adskillige grupper men ikke gruppe 2.

Med denne kode:
"SELECT DISTINCT u.user_id, u.firstname, if(u.user_id IN(SELECT user_id FROM kfisker_rights WHERE group_id = 2),'yes','no') AS member
FROM kfisker_user u, kfisker_rights r
WHERE u.user_id = r.user_id"
faar jeg dette resultat:
 
user_id  firstname  member 
1 navn1 yes
2 navn2 yes
4 navn4 no

Hvis du ogsaa gerne vil vide noget om bruger 3 (som ikke er medlem af nogen gruppe) kommer du nok til at bide i det sure aeble og bruge en LEFT JOIN query, saaledes:
"SELECT DISTINCT u.user_id, u.firstname, if(u.user_id IN(SELECT user_id FROM kfisker_rights WHERE group_id = 2),'yes','no') AS member
FROM kfisker_user u LEFT JOIN kfisker_rights r
ON u.user_id = r.user_id;"
som giver dette resultat:
 
user_id  firstname  member 
1 navn1 yes
2 navn2 yes
3 navn3 no
4 navn4 no
Avatar billede AnyFellow Mester
27. november 2010 - 19:13 #10
Super, det virker som ønsker. Det er dit sidste forslag der løser mit problem.

Pointene er dine.

Mit eneste spørgsmål er, om query'en nu er blevet for omfattende (ressourcekrævende), og det vil være bedre at lave 2 mere simple query: Én der finder alle brugere der er medlem af gruppen og én der finder alle der ikke er medlem?e
27. november 2010 - 21:15 #11
Det med kodeoptimering er ikke mit store nummer, men jeg skulle mene at med mindre du har millioner af kunder er indflydelsen minimal.  Hvis du alligevel gerne vil vide mere foreslaar jeg et nyt spoergsmaal saasom:  'jeg har denne kode ......  Boer jeg af resource hensyn dele den op ....  Det er der givet Eksperten-medlemmer der ved mere om end jeg.
Avatar billede AnyFellow Mester
28. november 2010 - 09:34 #12
Okay, tak for hjælpen.
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