[H-GEN] SQL query needed

Paul Gearon pag at pisoftware.com
Wed Aug 27 03:24:13 EDT 2003


[ Humbug *General* list - semi-serious discussions about Humbug and     ]
[ Unix-related topics. Posts from non-subscribed addresses will vanish. ]

Dale Stewart wrote:
> The query would look something like
> 
> select Students.STUDID, Students.name, maths1, english1 from Students, 
> Results, Tests
> where Students.STUDID = Results.STUDID
> and Results.TESTID = Tests.TESTID
> order by Students.STUDID
> 
> I think thats should work

Firstly, no, it won't work as you're expecting.  Secondly, I don't think 
you're providing what Paul wants (though I might have that wrong).

The data that this query returns will have duplicate student lines, with 
every line indicating a different test score, and all the other scores 
being null.  With the example data given (I've included it at the end) 
the result will look like:
  STUDID, name, maths1, english1
  1000, Bill, A, (null)
  1000, Bill, (null), B
  1002, Sue, B, (null)
  1002, Sue, (null), C

(caveat emptor: I'm doing this off the top of my head... I haven't typed 
this into a DB to check the results)

To merge the rows you can use agregate functions such as max().  This 
would modify the query to be something like this:

  select Students.STUDID, Students.name, max(maths1) as maths1, 
max(english1) as english1 from Students, Results, Tests
  where Students.STUDID = Results.STUDID
  and Results.TESTID = Tests.TESTID
  group by Students.STUDID, Students.name
  order by Students.STUDID

(I recall a DB recently wanting to ALSO "group by" the max() functions. 
  It might have been MySql.  Play with the query to get what you want)

However, I suspect that Paul may have wanted the columns for each 
subject to be automatically generated (since "maths1" and "english1" are 
both entries in the "Tests" table).  I don't actually know of an SQL way 
to do this in MySql (Arjen, can you help me here?).  It is possible in 
other databases, eg. <cough, cough> MSAccess does it with pivot queries.

The way to do this would be to write some php code which queries "Tests" 
and then uses the results to build an SQL query like the one above. 
It's pretty easy to do, it just isn't a single SQL query that does it 
all in one step.

>> Students = STUDID, name, class
>> 1000, Bill, 5a
>> 1002, Sue, 5a
>>
>> and
>> Results = STUDID, TESTID, result
>> 1000, 1, A
>> 1002, 1, B
>> 1000, 2, B
>> 1002, 2, C
>>
>> and
>> Tests = TESTID, description
>> 1, maths1
>> 2, english1
>>
>> I want to have a query that will return:
>> STUDID, name, maths1, english1
>> 1000, Bill, A, B
>> 1002, Sue, B, C


-- 
Regards,
Paul Gearon

Software Engineer                Telephone:   +61 7 3876 2188
Plugged In Software              Fax:         +61 7 3876 4899
http://www.PIsoftware.com        PGP Key available via finger

Catapultam habeo. Nisi pecuniam omnem mihi dabis, ad caput tuum saxum
immane mittam.
(Translation from latin: "I have a catapult. Give me all the money,
or I will fling an enormous rock at your head.")



--
* This is list (humbug) general handled by majordomo at lists.humbug.org.au .
* Postings to this list are only accepted from subscribed addresses of
* lists 'general' or 'general-post'.  See http://www.humbug.org.au/



More information about the General mailing list