[thelist] SQL query help

Erik Mattheis gozz at gozz.com
Wed Jan 2 17:39:23 CST 2002

><tip type="data modelling">
>never let the avoidance of sql complexity drive your table design
>i was biting my tongue trying not to comment on your poll design, as i,
>too, could see several ways to improve it

I'm all ears ... I know there's ways I could be doing things better 
in the SQL/DB arena.

>the sql i gave you was horribly complex (did it work, by the way?  it would
>be nice to know, in case i was wrong, because i like to put out little
>fires like that before they turn into big ones)

It gives the same error I was getting when trying to come up with 
something myself - it's the most dreaded error I get because I never 
understand why it happens:

[Microsoft][ODBC SQL Server Driver][SQL Server] Column 
'poll_options.option_id' is invalid in the select list because it is 
not contained in either an aggregate function or the GROUP BY clause.

Here is your query again:

    select top 1 poll_options.option_id, count(*), poll_options.option_text
        from poll_answers, poll_options
        where poll_answers.poll_id = poll_options.poll_id
            and poll_answers.poll_id =
            (   select poll_id
                   from polls
                 where poll_active=0
                     and poll_date =
                      (  select max(poll_date)
                                  from polls
                               where poll_active=0  )      )
       group by poll_answers.option_id
      order by 2 desc

I can easily follow that except for the first and last lines:

What is the count(*) counting? I'm looking for the top 
The way it is here, what value will determine what the TOP result is?

The "order by 2 desc" - what is this doing?

>but like my tip says, sql complexity avoidance is not the main design

This is my thinking ...I'm much more interested in keeping page 
processing time down than keeping database size down - I've got tons 
of disk space. And don't nested SELECTS like this significantly slow 
down processing time? It seems a better option for the purpose at 
hand to duplicate stuff if it will speed up page processing.

>if you are looking to restrict duplicates (e.g. the same IP number)
>consider using a unique constraint, and let the database do it for you
>it would have to be a multi-column constraint (e.g. including poll number),
>so make sure your database can handle that (sql/server can)

I can see that - but it would have to look at three things: poll_id, 
the user's IP and the date. And again, page processing speed is the 
most important thing other than making it slightly difficult to vote 
in the same poll more than once an hour.


- Erik Mattheis

(612) 377 2272


More information about the thelist mailing list