[mySQL]Pollgegevens joinen

Pagina: 1
Acties:

  • djluc
  • Registratie: Oktober 2002
  • Nu online
Ik ben bezig met een pollsysteem, het verschil met de meeste polls is echter dat ik per antwoord een record aanmaak in de tabel polla(antwoorden). Dit is noodzakelijk voor andere functies, maar daar gaat het nu even niet om, voordat we een hele disussie krijgen over optimaliteit ed ;) In de tabel poll staan de vragen en mogelijke antwoorden, dump:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE TABLE poll (
  id tinyint(5) NOT NULL auto_increment,
  waarde tinytext NOT NULL,
  pollid tinyint(5) NOT NULL default '0',
  site tinyint(5) NOT NULL default '0',
  PRIMARY KEY  (id),
  KEY site (site),
  KEY pollid (pollid)
) TYPE=MyISAM;

#
# Gegevens worden uitgevoerd voor tabel `poll`
#

INSERT INTO poll VALUES (1, 'Vraag 1', 0, 1);
INSERT INTO poll VALUES (2, 'antwoord 1', 1, 1);
INSERT INTO poll VALUES (3, 'antwoord 2', 1, 1);

Als pollid=0 hebben we te maken met een vraag, anders staat daar een link naar de vraag. Ik neem aan dat dit duidelijk is.

Dit is de tabel waar de antwoorden in worden geplaatst:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CREATE TABLE polla (
  id tinyint(5) NOT NULL auto_increment,
  aid tinyint(5) NOT NULL default '0',
  vid tinyint(5) NOT NULL default '0',
  user tinyint(5) NOT NULL default '0',
  datum varchar(20) NOT NULL default '',
  site tinyint(5) NOT NULL default '0',
  PRIMARY KEY  (id),
  KEY aid (aid,site),
  KEY vid (vid)
) TYPE=MyISAM;

#
# Gegevens worden uitgevoerd voor tabel `polla`
#

INSERT INTO polla VALUES (2, 3, 1, 5, '2003-01-24 10:36:50', 1);
INSERT INTO polla VALUES (3, 2, 1, 2, '2003-01-22 12:15:12', 1);
INSERT INTO polla VALUES (4, 2, 1, 1, '2003-01-21 19:20:14', 1);

Zoals je ziet hebben hier dus 3 mensen een antwoord gegeven, namelijk bezoekers 5,2 en 1. 2 mensen hebben 2, en één heeft 3 gestemd. Allemaal hebben ze op vraag 1 gestemd.

Nu wil ik met 1 query het volgende ophalen:
-totaal aantal stemmen op 1 antwoord
-de waarde van dat antwoord, dus bijvoorbeeld 'antwoord 1'
-de waarde van de vraag

Die eerste lukt met het onderstaand query, maar die waarden ophalen lukt op een of andere manier niet, ik krijg bij alle antwoorden 'vraag 1' als waarde?

code:
1
2
3
4
5
6
7
8
9
SELECT COUNT( 
DISTINCT (
a.id
) ) AS totantw, a.vid, a.aid, p.waarde
FROM polla a, poll p
WHERE a.aid = p.id OR (
a.vid = p.id
)
GROUP BY a.aid LIMIT 0, 30

[ Voor 8% gewijzigd door djluc op 25-01-2003 11:34 . Reden: verduidelijking ]


  • kvdveer
  • Registratie: November 2000
  • Laatst online: 06-11-2025

kvdveer

Z.O.Z.

code:
1
2
3
4
SELECT COUNT(polla.id), poll.pollid, poll.waarde
FROM polla 
  LEFT JOIN poll ON polla.vid = poll.id
GROUP BY poll.id


Het probleem zit 'm er in dat jij ten onrechte de vraag en het anwoord in dezelfde tabel hebt gemodelleerd. Dat hoort niet, want het zijn verschillende gegevens, met onverenigbare eigenschappen. De bovenstaande query zou icm wat scripting code wel het gevraagde moeten geven.

Localhost, sweet localhost


  • smaij
  • Registratie: November 2000
  • Laatst online: 24-08 15:57
Normaliseer :)

zo heb ik het ongeveer
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#
# Table structure for table 'poll_answers'
#

CREATE TABLE `poll_answers` (
  `PollID` int(10) unsigned default '0',
  `PollAnswerID` int(10) unsigned NOT NULL auto_increment,
  `PollAnswer` tinytext,
  `PollVotes` int(10) unsigned default '0',
  PRIMARY KEY  (`PollAnswerID`),
  KEY `PollID` (`PollID`)
) TYPE=MyISAM;



#
# Table structure for table 'poll_log'
#

CREATE TABLE `poll_log` (
  `PollID` int(10) unsigned default '0',
  `UserID` int(10) unsigned default '0',
  `Ip` varchar(15) default '0',
  KEY `PollID` (`PollID`,`UserID`,`Ip`)
) TYPE=MyISAM;



#
# Table structure for table 'poll_poll'
#

CREATE TABLE `poll_poll` (
  `PollID` int(10) NOT NULL auto_increment,
  `PollQuestion` tinytext,
  `PollCreator` int(10) unsigned default '0',
  `PollActive` tinyint(1) unsigned default '0',
  `PollLastStatus` tinyint(1) unsigned default NULL,
  `PollTotalVotes` int(10) unsigned default '0',
  `PollDate` datetime default NULL,
  PRIMARY KEY  (`PollID`)
) TYPE=MyISAM;


[edit]

Waarom zou je de individuele stem bijhouden? Je moet alleen bijhouden of iemand gestemd heeft ja of nee.. Voorderest is het gewoon een optelsommetje in een update query..

[ Voor 14% gewijzigd door smaij op 25-01-2003 12:42 ]


  • robjanssen
  • Registratie: September 2001
  • Laatst online: 02-08 16:10

robjanssen

Software Developer

code:
1
2
3
4
SELECT COUNT(polla.aid), polla.aid, poll.waarde
FROM polla
INNER JOIN poll ON polla.vid = poll.id
GROUP BY polla.aid, poll.waarde

  • djluc
  • Registratie: Oktober 2002
  • Nu online
Robjanssen: jouw sql geeft hetzelfde probleem, dat overal vraag1 als waarde staat.

Smaij: Je opmerking over het apart bijhouden van alle stemmen, het is echt nodig neem dat maar van me aan, deze poll is maar een klein deel van iets groters waarvoor dat nodig is. Als het gewoon een poll zou worden zoals er al zoveel zijn zou ik echt niet zo moeilijk gaan zitten doen ;)

kvdveer: met jouw statement krijg ik alleen de id van de vraag, het aantal antwoorden erop, en de waarde van de vraag. Ik heb er ook over zitten denken om met 3 tabellen te gaan werken, dit leek mij echter minder optimaal omdat je dan over 3 tabellen moet gaan joinen. Verder zijn de vragen en atwoorden op dezelfde manier opgezet, ze worden gescheiden door middel van een type, namelijk pollid, dus dit zou eigenlijk zo wel moeten kloppen.

[ Voor 2% gewijzigd door djluc op 26-01-2003 14:50 . Reden: typo ]