Avatar billede Slettet bruger
03. august 2010 - 17:06 Der er 20 kommentarer og
1 løsning

Relativt kompleks forespørgsel

Hej eksperter,

Lad os antage, at jeg har følgende tabeller:

Brugere
- Id (int)

Grupper
- Id (int)
- Navn (varchar)

Gruppemedlemskaber
- Id (int, formentligt irrelevant)
- Gruppe (int - reference til gruppes Id)
- Bruger (int - reference til brugers Id)

Projekter
- Id (int)
- Gruppe (int - reference til gruppes Id)
- Beskrivelse (varchar)

Gruppemedlemskaber parrer grupper og brugere og repræsenterer således medlemskab, således at en gruppedeltagelse med Gruppe=G og Bruger=B medfører, at brugeren med Id=B er medlem af gruppen med Id=G. Det er mere enkelt, end jeg forklarer det!

Nu vil jeg gerne have udskrevet en liste over beskrivelserne på de projekter, en bruger (ud fra brugers Id) deltager i; dvs. samtlige projekter, hvor projektets Gruppe er lig Gruppe for et gruppemedlemskab, hvor Bruger samtidig er lig brugerens Id. Samtidig skal jeg for hvert output vide, hvad gruppens navn er - altså Navn for den gruppe, hvor Id samtidig er lig projektets Gruppe.

For at opsummere: Jeg skal have udskrevet Beskrivelse for hvert projekt, brugeren via grupper deltager i samt den forbindende gruppes Navn.

Kan det gøres med et enkelt MySQL-request (fra PHP) - og hvordan? I modsatte fald må jeg stykke noget sammen af en løkke og lidt gaffa.
Avatar billede arne_v Ekspert
03. august 2010 - 17:12 #1
SELECT projekter.beskrivelse
FROM brugere,gruppemedlemskaber,grupper,projekter
WHERE brugere.id=gruppemedlemskaber.bruger AND gruppemedlemskaber.gruppe=gruppe.id AND gruppe.id=projekter,gruppe AND bruger.id=x
Avatar billede arne_v Ekspert
03. august 2010 - 17:13 #2
kortere men maaske lidt mindre fleksibelt:

SELECT projekter.beskrivelse
FROM gruppemedlemskaber,projekter
WHERE gruppemedlemskaber.gruppe=projekter.gruppe AND gruppemedlemskaber.bruger=x
Avatar billede arne_v Ekspert
03. august 2010 - 17:14 #3
jeg ville ioevrigt droppe feltet Gruppemedlemskaber.id og lave en sammensat primaernoegle
Avatar billede Slettet bruger
03. august 2010 - 19:55 #4
Tak.
Inden jeg fortsætter:
"jeg ville ioevrigt droppe feltet Gruppemedlemskaber.id og lave en sammensat primaernoegle"
Det lyder fancy; hvad er en sammensat primærnøgle?
Avatar billede arne_v Ekspert
03. august 2010 - 20:05 #5
det er en primaernoegle som bestaar af flere felter

CREATE TABLE gruppemedlemskaber (
    id INT NOT NULL,
    gruppe INT NOT NULL,
    bruger INT NOT NULL,
    PRIMARY KEY(id)
);

->

CREATE TABLE gruppemedlemskaber (
    gruppe INT NOT NULL,
    bruger INT NOT NULL,
    PRIMARY KEY(gruppe,bruger)
);
Avatar billede arne_v Ekspert
03. august 2010 - 20:05 #6
det er en primaernoegle som bestaar af flere felter

CREATE TABLE gruppemedlemskaber (
    id INT NOT NULL,
    gruppe INT NOT NULL,
    bruger INT NOT NULL,
    PRIMARY KEY(id)
);

->

CREATE TABLE gruppemedlemskaber (
    gruppe INT NOT NULL,
    bruger INT NOT NULL,
    PRIMARY KEY(gruppe,bruger)
);
Avatar billede arne_v Ekspert
03. august 2010 - 20:05 #7
det er en primaernoegle som bestaar af flere felter

CREATE TABLE gruppemedlemskaber (
    id INT NOT NULL,
    gruppe INT NOT NULL,
    bruger INT NOT NULL,
    PRIMARY KEY(id)
);

->

CREATE TABLE gruppemedlemskaber (
    gruppe INT NOT NULL,
    bruger INT NOT NULL,
    PRIMARY KEY(gruppe,bruger)
);
Avatar billede arne_v Ekspert
03. august 2010 - 20:05 #8
det er en primaernoegle som bestaar af flere felter

CREATE TABLE gruppemedlemskaber (
    id INT NOT NULL,
    gruppe INT NOT NULL,
    bruger INT NOT NULL,
    PRIMARY KEY(id)
);

->

CREATE TABLE gruppemedlemskaber (
    gruppe INT NOT NULL,
    bruger INT NOT NULL,
    PRIMARY KEY(gruppe,bruger)
);
Avatar billede Slettet bruger
03. august 2010 - 20:47 #9
Okay, tak. Jeg roder lige med det...
Avatar billede arne_v Ekspert
03. august 2010 - 20:48 #10
De 4 kopier skyldes altsaa en haengende FF og ikke en mening om at indholdet var 4 kopier vaerd ...

:-)
Avatar billede Slettet bruger
03. august 2010 - 21:06 #11
Det skader nok ikke at læse det igennem fire gange :)
Avatar billede Slettet bruger
03. august 2010 - 21:28 #12
SELECT `projekt.id`, `projekt.time`, `projekt.title`, `projekt.desc`, `gruppe.id`, `gruppe.label` FROM `gruppe`, `medlemskab`, `projekt` WHERE (`class` = '1') AND (`projekt.owner` = `gruppe.id`) AND (`gruppe.id` = `medlemskab.group`) AND (`medlemskab.user` = '1') AND (`time` = '1280102400')

Unknown column 'projekt.id' in 'field list'

???
Avatar billede Slettet bruger
03. august 2010 - 21:35 #13
Rettet til:

SELECT `projekt.id`, `projekt.time`, `projekt.title`, `projekt.desc`, `gruppe.id`, `gruppe.label` FROM `gruppe`, `medlemskab`, `projekt` WHERE (`projekt.class` = '1') AND (`projekt.owner` = `gruppe.id`) AND (`gruppe.id` = `medlemskab.group`) AND (`medlemskab.user` = '1') AND (`projekt.time` = '1280102400')

Fejlen forbliver.
Avatar billede Slettet bruger
04. august 2010 - 13:48 #14
Anyone? :(
Avatar billede Slettet bruger
05. august 2010 - 10:01 #15
.......................................
Det er selvfølgeligt `tabel`.`kolonne` og ikke `tabel.kolonne`.
Avatar billede Slettet bruger
05. august 2010 - 10:28 #16
Nu bliver det endnu sjovere :)
Jeg vil gerne sortere noget data efter, hvorvidt en forbindelse eksisterer. For at være specifik:

Brugere
- Id (int)

Grupper
- Id (int)
- Navn (varchar)

Gruppemedlemskaber
- Gruppe (int - reference til gruppes Id)
- Bruger (int - reference til brugers Id)

Projekter
- Id (int)
- Gruppe (int - reference til gruppes Id)
- Beskrivelse (varchar)

Tilstede
- Projekt (int - reference til projektets Id)
- Bruger (int - reference til brugerens Id)

Hvordan kan jeg så tilføje en sortering til query'en, så bruger/projekt-par for hvilken en entry i Tilstede findes kommer før dem, for hvilken ingen entry i Tilstede eksisterer? Kan dette stadig gøres med en enkelt query?
Avatar billede groyk Novice
15. august 2010 - 21:30 #17
Hvis det oprindelige spørgsmål er blevet besvaret, er det på sin plads at lukke, ved at anmode om svar i dette tilfælde fra arne_v. For derefter at oprette et nyt spørgsmål der vedr. det nye "issue".

mvh
Simon
Avatar billede Slettet bruger
15. august 2010 - 21:36 #18
Tja, hvis nogen alligevel kendte svaret, kunne det lige så godt komme frem her, men jeg har faktisk hittet ud af det i mellemtiden.

Svar, Arne?
Avatar billede Slettet bruger
18. august 2010 - 17:42 #19
Nå ikke.
Avatar billede arne_v Ekspert
19. august 2010 - 19:08 #20
jeg missede mailen soendag
Avatar billede Slettet bruger
19. august 2010 - 20:06 #21
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