Gå til innhold

Anbefalte innlegg

Jeg prøver å telle antall svar i en undersøkelse, men har støtt på et lite problem. De svar som ikke er avgitt blir ikke med.

 

Jeg har et par tabeller:

avstemning - med spørsmålene og id for disse

svar - svaralternativene med svarid, og avstemningsid som fremmednøkkel

brukersvar - det brukeren har svart. svarid og brukerid.

 

Hvordan kan jeg telle opp brukersvar fordelt på svar for en avstemning på en slik måte at jeg får med alle svaralternativer (også de som ingen har svart)?

Lenke til kommentar
Videoannonse
Annonse
Jeg prøver å telle antall svar i en undersøkelse, men har støtt på et lite problem. De svar som ikke er avgitt blir ikke med.

 

Jeg har et par tabeller:

avstemning - med spørsmålene og id for disse

svar - svaralternativene med svarid, og avstemningsid som fremmednøkkel

brukersvar - det brukeren har svart. svarid og brukerid.

 

Hvordan kan jeg telle opp brukersvar fordelt på svar for en avstemning på en slik måte at jeg får med alle svaralternativer (også de som ingen har svart)?

5640160[/snapback]

Det er litt vanskelig å svare på dette spørsmålet siden du ikke sier hvilken database du bruker, men jeg regner med at det er noe i retning av Microsoft SQL Server sin isnull(), som vel forøvrig heter nvl() i Oracle, du er på jakt etter.

Lenke til kommentar
Jeg prøver å telle antall svar i en undersøkelse, men har støtt på et lite problem. De svar som ikke er avgitt blir ikke med.

 

Hva mener du?

Du sier at du vil telle antall svar og sier du at spoerringen ikke teller de som ikke har avgitt svar (dette er en selvmotsigelse). Vil du telle hvor mange som har tatt del i spoerreundersoekelsen og hvilke svar de ga (hvor "ikke avgitt svar" er ett mulig svar)?

 

Ser at du har en svar tabell i tillegg til aa lagre informasjon om hva brukerne har svart (brukersvar), dette maa du forklare naermere.

Feks, lagrer brukersvar en kopi av svaralternativene lagret i svar tabellen??

Kan de velge mellom aa lagre egne svar eller aa velge ett av svaralternativene i svar tabellen??

 

Hvis brukerne skal kun faa velge ett av svaralternativene i svar tabellen saa foreslaar jeg at du fjerner attributen i brukersvartabellen som lagrer hva brukeren har svart.

 

Eksempel:

CREATE TABLE bruker (
bruker_id INT(8) AUTO_INCREMENT,
fornavn VARCHAR(30) NOT NULL, 
etternavn VARCHAR(30) NOT NULL,
CONSTRAINT BRUKER_PK PRIMARY KEY (bruker_id)
);

CREATE TABLE avstemning (
avstemning_id INT(4) AUTO_INCREMENT,
spoersmaal VARCHAR(50) NOT NULL,
CONSTRAINT AVSTEMNING_PK PRIMARY KEY (avstemning_id)
);

CREATE TABLE svar (
svar_id INT(6) AUTO_INCREMENT,
svar VARCHAR(50) NOT NULL,
avstemning_id INT(4) NOT NULL,
CONSTRAINT SVAR_PK PRIMARY KEY (svar_id),
COSNTRAINT SVAR_FK_TO_AVSTEMNING FOREIGN KEY (avstemning_id)
REFERENCES avstemning (avstemning_id)
);

CREATE TABLE brukersvar (
brukersvar_nummer INT(10) AUTO_INCREMENT,
bruker_id INT(8) NOT NULL,
svar_id INT(6) NOT NULL,
CONSTRAINT BRUKERSVAR_PK PRIMARY KEY (brukersvar_nummer),
CONSTRAINT BRUKERSVAR_FK_TO_BRUKER FOREIGN KEY (bruker_id)
REFERENCES bruker (bruker_id),
CONSTRAINT BRUKERSVAR_FK_TO_SVAR FOREIGN KEY (svar_id)
REFERENCES svar (svar_id)
);

 

Som du ser er dette eksempelet saa og si likt ditt utenom brukersvar.

 

For aa finne ut hvor mange som har valgt de forskjellige svaralternativene for ett spoersmaal saa kan du kjoere en spoerring alla dette:

SELECT s.svar, COUNT(bs.brukersvar_nummer)
FROM svar s
INNER JOIN brukersvar bs USING (svar_id)
WHERE s.avstemning_id = 1
GROUP BY s.svar;

Lenke til kommentar

Dette ble visst mye rot.

 

Jeg bruker mysql 4.0.

Det jeg ønsker å gjøre er å liste opp alle svaralternativer for en avstemning med antall stemmer for hvert alternativ. På samme som en typisk avstemning her eller andre steder.

 

Det jeg ikke får til er å få med de svaralternativene som ingen har valgt.

 

Kjapp oversikt over tabellene

Avstemning - avstemningid (PK), spørsmålet, tid for oprettelse, bruker som laget den.

Svar - svarid (PK), avstemningid (FK), svaralternativ

Brukersvar - Brukerid PK), avstemningid (PK), svarid (FK)

 

Brukersvar inneholder mao kun id'er. Selve svaret ligger i 'svar'.

Kun et svar kan velges.

 

Eksempel på hvordan innholdet skal vises:

Er du glad i sport?

Ja - 23

Nei - 6

Vet ikke - 0

 

Tallene skal da være antall som har svart for hvert alternativ. I mitt tilfelle får jeg ikke med alternativ hvor antall er 0.

Lenke til kommentar
Dette ble visst mye rot.

 

Jeg bruker mysql 4.0.

Det jeg ønsker å gjøre er å liste opp alle svaralternativer for en avstemning med antall stemmer for hvert alternativ. På samme som en typisk avstemning her eller andre steder.

 

Det jeg ikke får til er å få med de svaralternativene som ingen har valgt.

 

Kjapp oversikt over tabellene

Avstemning - avstemningid (PK), spørsmålet, tid for oprettelse, bruker som laget den.

Svar - svarid (PK), avstemningid (FK), svaralternativ

Brukersvar - Brukerid PK), avstemningid (PK), svarid (FK)

 

Brukersvar inneholder mao kun id'er. Selve svaret ligger i 'svar'.

Kun et svar kan velges.

 

Eksempel på hvordan innholdet skal vises:

Er du glad i sport?

Ja - 23

Nei - 6

Vet ikke - 0

 

Tallene skal da være antall som har svart for hvert alternativ. I mitt tilfelle får jeg ikke med alternativ hvor antall er 0.

5646137[/snapback]

 

Noe i retning av:

 

select
 s.svaralternativ,
 null(count(b.svarid),0)
from avstemning a 
 inner join svar s 
   on (s.avstemningid = a.avstemningid)
 left outer join brukersvar b on (
   on ((b.avstemningid = a.avstemningid) and (b.svarid = s.svarid))

 

Jeg husker ikke helt syntaksen i MySQL, så det kan være noen feil og/eller mangler over.

Lenke til kommentar

Fikk det til etterhvert.

Sikkert skrevet så ille som det kan gjøres, men det funker tilsynelatende ihvertfall.

 

Takk for alle svar.

 

Skrev om Roac's litt:

select s.svarid, s.svaralt, count(b.svarid)
from avstemning a
inner join svar s
on (s.avstemningid = a.avstemningid) and (a.avstemningid = $avstemningid)
left outer join brukersvar b
on ((b.avstemningid = a.avstemningid) and (b.svarid = s.svarid))
group by s.svarid

 

Takk igjen, Roac. Har som du sikkert skjønner ikke kommet helt i mål på forståelsen av JOIN enda. Skal begynne å lese snart... :)

 

[EDIT] Leif var innom. Pynte litt.[/EDIT]

Endret av XmasB
Lenke til kommentar

Ser du har fått løst problemet, men tror det skal også fungere med min spørring hvis du bytter ut Inner Join med Left Outer Join:

SELECT s.svar, COUNT(bs.svar_id)
FROM svar s
LEFT OUTER JOIN brukersvar bs USING (svar_id)
WHERE bs.avstemning_id = 1
GROUP BY s.svar;

 

INNER JOIN joiner kun to tabeller som har en felles svar_id, dvs at kun at avgitte svar vil vises.

Left outer join lister alle dataene i svar tabellen uannsett om disse svarene er blitt brukt i brukersvar (at svar_idene er blitt lagret) eller ikke. Hvis den ikke finner noe data for ett svar i brukersvar så fyller den ut de resterende dataene med null's.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...