query in a query

query in a query

am 20.02.2006 03:54:48 von WindAndWaves

Hi Folk

I have a query:

SELECT COUNT( `SIS`.`ID` ) c, D
FROM `SIS` , `SID`
WHERE `SID_ID` = `SID`.`ID`
AND `BRO` <> "bot"
GROUP BY SID.ID

And from the results, I want to select the following:

SELECT AVG(c), D FROM RESULTS GROUP BY D

Can I do this in one sql statement? Or do I need to create a temporary
table?

TIA

> Nicolaas

Re: query in a query

am 20.02.2006 04:39:47 von Michael Austin

windandwaves wrote:

> Hi Folk
>
> I have a query:
>
> SELECT COUNT( `SIS`.`ID` ) c, D
> FROM `SIS` , `SID`
> WHERE `SID_ID` = `SID`.`ID`
> AND `BRO` <> "bot"
> GROUP BY SID.ID
>
> And from the results, I want to select the following:
>
> SELECT AVG(c), D FROM RESULTS GROUP BY D
>
> Can I do this in one sql statement? Or do I need to create a temporary
> table?
>
> TIA
>
>
>>Nicolaas
>
>
>

why are you enclosing everything in quotes...

SELECT COUNT( SIS.ID ) c, sid.D d
FROM SIS , SID
WHERE SIS.ID = SID.ID
AND SIS.BRO <> 'bot' -- SID.BRO??
GROUP BY SID.ID


--
Michael Austin.
DBA Consultant
Donations welcomed. Http://www.firstdbasource.com/donations.html
:)

Re: query in a query

am 20.02.2006 04:56:10 von WindAndWaves

Michael Austin wrote:

> why are you enclosing everything in quotes...

I like to have good habits and a while ago I decided to stick with one way
of writing all my queries.

For example, if I had 100 php pages and I wanted to find any field called
BRO so that I could change it to BOT, then I could just do a search for
`BRO`. While otherwise words like browser would also show up (ignoring upper
and lower case in this example).

Do you know the answer to my question by any chance?

TIA

> Nicolaas

Re: query in a query

am 20.02.2006 06:51:23 von Bill Karwin

"windandwaves" wrote in message
news:G5bKf.151390$vH5.1285616@news.xtra.co.nz...
> I like to have good habits and a while ago I decided to stick with one way
> of writing all my queries.

I'd suggest the following additional habits:

1. Use the delimited identifiers consistently if you use them at all.
2. Use table aliases.
3. List the table alias prefix for all fields in all clauses of the query,
to make it more clear in which table each column is found.
4. Use the JOIN syntax instead of SQL-89 join style. If you do, your goal
of one way of writing queries will be easier to achieve when you start using
outer joins.
5. Avoid naming columns "ID". It's more clear to use SIS_ID and SID_ID for
both referenced and referencer of a given column.
6. You might want to read Joe Celko's book "SQL Programming Style" if good
habits and consistent style are important to you.

It's hard to analyze your query to suggest another syntax, because I can't
tell for certain which table D and BRO belong to. I can infer that SID
includes columns ID and D, while SIS probably includes columns ID, SID_ID,
and BRO. Please post a clear description of your schema when you post
questions to newsgroups. The best description is a dump of the CREATE TABLE
statements to create the schema, including referential integrity
constraints.

Your desired query computes the average per D count of SIS's per ID.
(So in other words, if SID is an order, and SIS is a line-item in an order,
and D is a department submitting orders within the organization, you want
the average number of line-items in an order, per department.)

The groupings applied by GROUP BY apply to all aggregate functions in that
query. So you need to do the two calculations in separate queries. Either
store the count per SIS.ID in a temp table, or else feed it to the average
calculation by use of a subquery in a derived view:

SELECT AVG(R.`C`) AS Avg, R.`D`
FROM (
SELECT COUNT( S.`ID` ) AS C, D.`D`
FROM `SIS` AS S INNER JOIN `SID` AS D ON S.`SID_ID` = D.`ID`
WHERE S.`BRO` <> 'bot'
GROUP BY D.`ID`
) AS R
GROUP BY R.`D`

Regards,
Bill K.

Re: query in a query

am 20.02.2006 10:48:53 von WindAndWaves

Bill Karwin wrote:

Thank you for your reply and all the information! Great.

> news:G5bKf.151390$vH5.1285616@news.xtra.co.nz...
>> I like to have good habits and a while ago I decided to stick with
>> one way of writing all my queries.
>
> I'd suggest the following additional habits:
>
> 1. Use the delimited identifiers consistently if you use them at all.

usually do - try to anyway

> 2. Use table aliases.

what is the joy of that?

> 3. List the table alias prefix for all fields in all clauses of the
> query, to make it more clear in which table each column is found.
> 4. Use the JOIN syntax instead of SQL-89 join style. If you do, your
> goal of one way of writing queries will be easier to achieve when you
> start using outer joins.

lol - I thought that SQL-89 was a joke - as in super archaic, ... but I
googled it and it exists! Is join faster? I just always find it a bit
confusing, inner join, outer join, left join, etc.. i have used it and I can
work it out, but it seems more work.

> 5. Avoid naming columns "ID". It's more clear to use SIS_ID and
> SID_ID for both referenced and referencer of a given column.

Old habits die hard!

> 6. You might want to read Joe Celko's book "SQL Programming Style" if
> good habits and consistent style are important to you.

Lots to learn!

> It's hard to analyze your query to suggest another syntax, because I
> can't tell for certain which table D and BRO belong to. I can infer
> that SID includes columns ID and D, while SIS probably includes
> columns ID, SID_ID, and BRO. Please post a clear description of your
> schema when you post questions to newsgroups. The best description
> is a dump of the CREATE TABLE statements to create the schema,
> including referential integrity constraints.
>
> Your desired query computes the average per D count of SIS's per ID.
> (So in other words, if SID is an order, and SIS is a line-item in an
> order, and D is a department submitting orders within the
> organization, you want the average number of line-items in an order,
> per department.)

Yes, it actually measures the average number of searches (SIS) carried out
per user (SID) per month (D).
>
> The groupings applied by GROUP BY apply to all aggregate functions in
> that query. So you need to do the two calculations in separate
> queries. Either store the count per SIS.ID in a temp table

I thought about that, the reason I did not do it is when lots of people
access the data at the same time then this may create a bit of a mess.

, or else
> feed it to the average calculation by use of a subquery in a derived
> view:
> SELECT AVG(R.`C`) AS Avg, R.`D`
> FROM (
> SELECT COUNT( S.`ID` ) AS C, D.`D`
> FROM `SIS` AS S INNER JOIN `SID` AS D ON S.`SID_ID` = D.`ID`
> WHERE S.`BRO` <> 'bot'
> GROUP BY D.`ID`
> ) AS R
> GROUP BY R.`D`

I tried it - this is what I got as error.

SELECT AVG( R.`C` ) AS Avg, R.`M` AS
MONTH FROM (

SELECT COUNT( S.`ID` ) AS C, D.`NOW` AS M
FROM `SIS` AS S
INNER JOIN `SID` AS D ON S.`SID_ID` = D.`ID`
WHERE D.`BRO` & lt ; & gt;

'bot' GROUP BY D.`ID`
) AS R GROUP BY R.`M` LIMIT 0 , 30
MySQL said:
#1064 - You have an error in your SQL syntax. Check the manual that
corresponds to your MySQL server version for the right syntax to use near
'SELECT COUNT( S . `ID` ) AS C , D . `NOW` AS M FROM `SIS` AS S

I am running version 4.0.18-standard, reading the MySql manual, it seems
that I may be out of luck.



>
> Regards,
> Bill K.

Re: query in a query

am 20.02.2006 22:54:28 von Bill Karwin

"windandwaves" wrote in message
news:mggKf.151469$vH5.1287628@news.xtra.co.nz...
>> 2. Use table aliases.
>
> what is the joy of that?

Try writing a reflexive join without using table aliases.

> lol - I thought that SQL-89 was a joke - as in super archaic, ... but I
> googled it and it exists! Is join faster?

SQL-89 was a published ANSI standard, which included much of the SQL syntax
we use today. SQL-92 introduced the JOIN syntax, which enable some types of
joins that were not possible with the "FROM a, b WHERE a.id = b.id" syntax.

The two syntax forms should be more or less equivalent in performance,
because the RDBMS converts both forms into an internal representation before
actually executing the query. But you simply cannot do some types of JOINs
using the older syntax.

> I just always find it a bit confusing, inner join, outer join, left join,
> etc.. i have used it and I can work it out, but it seems more work.

You said you want to use one way to write all your queries. You probably
will have a need for outer joins someday, so you better get used to the JOIN
syntax and start using that consistently.

> Old habits die hard!

Well, you were the one who said you wanted to have good habits. Choose one
or the other: either adopt good habits, or have bad habits that die hard.

I don't mean to be clubbing you on the head over this, but if you talk the
talk, you've got to walk the walk! :-)

> I am running version 4.0.18-standard, reading the MySql manual, it seems
> that I may be out of luck.

Right. MySQL 4.1 is required in order to do subqueries.

Regards,
Bill K.

Re: query in a query

am 21.02.2006 00:46:54 von WindAndWaves

Bill Karwin wrote:

snip snip..... see earlier posts

THANK YOU SO MUCH.

Much appreciated your help Bill. I am a bit of a tyre kicker without formal
IT education or anything like that, but with the intention to become a world
leading web developer.

I will start joining from now on ;-)

Nicolaas