You might have to tweak the following a bit for syntax: SELECT a.name, COUNT(b.id) as votes FROM poll_options as a LEFT JOIN poll_votes as b ON a.id=b.oid WHERE b.pid='<poll_id>' GROUP BY b.oid
Also, you can refer to: http://www.mysql.com/doc/en/JOIN.html Bhavin. ----- Original Message ----- From: "Blaster" <[EMAIL PROTECTED]> To: <[EMAIL PROTECTED]> Sent: Saturday, January 11, 2003 12:35 PM Subject: SQL optimization problem > Hey, > > (this post is pretty long, a short version of the problem is listed at the > bottom if you don't like reading long emails :P) > > I'm currently going through all my SQL queries for my webpage to see if > there is anything I can do to optimize them. > On my webpage, i have this poll where people can give their opinion in > various subjects by casting a vote. To begin > with, I'd like to tell you how I created my tables for this task, the poll > uses in total 3 different tables as following: > > poll_list (this table contains the actual question of each poll) > =========================================== > id (int) | stamp (datetime) | question (varchar 255) | active (tinyint) > > Id is simply an autoincrementing ID for each poll, > > Stamp is the creation date of the poll, > > Question holds the actual question (duh :P) > > If Active is 1, it means that this is the active poll right now. > Only one poll can be active at the same time. > > poll_options (this table holds the valid answers for each poll. You may use > any number of answers in your poll) > ============================================================================ ==== > id (int) | pid (int) | name (varchar 255) > > id is again, autoinc field for this answer > > pid is a pointer to which poll this particular answer belongs to, i.e pid = > poll_list.id > > name holds the actual answer string > > poll_votes (this table holds all the casted votes, one row is one vote) > ================================================= > id (int) | pid (int) | oid (int) | uid (int) > > id, autoinc > > pid, pointer to poll_list.id, tells me which poll this vote belongs to > > oid, pointer to poll_options.id, tells me which option this user voted > > uid, pointer to user account. I won't include the user table, just think of > this as a unique identifier > for the users, prevents the same user from voting twice in a poll.. > > > AND now! to the problem! Prior to my "optimzation" checking began, the code > to display the > results of a poll was something like this: > > 1) Fetch the active poll: > SELECT * FROM poll_list WHERE (active > 0) ORDER BY stamp DESC LIMIT 1 > > 2) Fetch the answers for the poll ID we received from the prior query: > SELECT * FROM poll_options WHERE pid='<id_from_prior_query>' > > 3) For each option received in step 2, I did: > SELECT * FROM poll_votes WHERE pid='<poll_id>' AND oid='<option_id>' > > 4) Output HTML formated code to web visitor. > > Now, I thought, it MUST be possible to make step 2 and 3 using 1 single > query, because using this old > system (as shown above), it requires 1 + n queries, where n is number of > answers in that particular poll. > > So, I simply replaced it with: > > 1) Fetch the active poll: > SELECT * FROM poll_list WHERE (active > 0) ORDER BY stamp DESC LIMIT 1 > > 2) Fetch the answers & votes in the same query: > SELECT a.name, COUNT(b.id) as votes FROM poll_options as a, poll_votes as b > WHERE b.pid='<poll_id>' AND b.oid=a.id GROUP BY b.oid > > 3) Print the results. > > #################### PROBLEM BEGINS HERE ########################## > > However! Here comes the problem, if no vote is cast on an option, it will > not show up in the list! I want it to print 0% > for any options that havn't received a vote, like it would with my old > query system. This is basically what I want to > do: > > Select all options from poll_options and, in the same query, count the > number of rows in poll_votes which has that > particular options "id" as "oid". Pretty hard to explain, but ideally, I'd > like to do > > SELECT a.name, COUNT(b.id) as votes FROM poll_options as a, poll_votes as b > WHERE b.pid='<poll_id>' AND b.oid=a.id GROUP BY b.oid > > With one exception, if votes = 0, it should be listed in the result aswell! > > > --------------------------------------------------------------------- > Before posting, please check: > http://www.mysql.com/manual.php (the manual) > http://lists.mysql.com/ (the list archive) > > To request this thread, e-mail <[EMAIL PROTECTED]> > To unsubscribe, e-mail <mysql-unsubscribe-##L=##[EMAIL PROTECTED]> > Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php > --------------------------------------------------------------------- Before posting, please check: http://www.mysql.com/doc/ (the manual) http://lists.mysql.com/ (the list archive) To request this thread, e-mail <[EMAIL PROTECTED]> To unsubscribe, e-mail <mysql-unsubscribe-##L=##[EMAIL PROTECTED]> Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php