27. november 2010 - 13:58Der 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?
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
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
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......
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".
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
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
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.
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.