[ciapug] SQL wiz?
Scott Phillips
ciapug@cialug.org
Tue, 15 Feb 2005 11:24:29 -0600
Thanks for the tutorial, Claus! Once upon a time I knew what all those
join types did. If you don't use it, you loose it I guess. I didn't
realize a left join without "on" would return every combination like
that. (Pretty much useless isn't it?) That's what was throwing me. Makes
sense now.
Thanks again.
At 10:19 AM 2/15/2005 -0600, you wrote:
>The "ON" statement specifies on what columns the two table are being
>joined. You really need to learn SQL to understand this stuff. Here's a
>small crappy lesson. Assume you have table_a and table_b like this:
>
>table_a
>id | name
>---+-----
>1 | Arnold
>2 | John
>4 | Bob
>5 | Jim
>
>table_b
>id | grade
>---+------
>1 | B-
>2 | A+
>2 | C
>3 | D
>5 | A
>
>Now you are joining the tables on the common column "id" like this:
>
>select a.id,
> a.name,
> b.grade
>from table_a a
> left join table_b b on (a.id = b.id)
>order by a.id
>
>The result will be:
>
>id | name | grade
>---+--------+-------
>1 | Arnold | B-
>2 | John | A+
>2 | John | C
>4 | Bob | <null>
>5 | Jim | A
>
>Note three things:
>- the record 2 has two rows since there are two rous in table_b
>- the record 4 has null as a grade since no entry was found in table_b
> (this behavior is due to the "left join")
>- the record 3 does not appear since it has no entry in table_a which is
> the driving table (due to the "left join")
>
>If you don't specify the on statement then all rows from one table will be
>joined with all rows from the other table and you get a huge mess like this:
>
>id | name | grade
>---+--------+-------
>1 | Arnold | B-
>1 | Arnold | A+
>1 | Arnold | C
>1 | Arnold | D
>1 | Arnold | A
>2 | John | B-
>2 | John | A+
>2 | John | C
>2 | John | D
>2 | John | A
>4 | Bob | B-
>4 | Bob | A+
>4 | Bob | C
>4 | Bob | D
>4 | Bob | A
>5 | Jim | B-
>5 | Jim | A+
>5 | Jim | C
>5 | Jim | D
>5 | Jim | A
>
>So much for the join, now on with the count and group statement. First
>and foremost I'm supprised that the statement works without having to
>specifiy also the columns news_title, news_article, and news_release_dt in
>the "group by" statement. This might be a special feature that mysql has
>but it will most likely not work if you use that statement with another
>database.
>
>Assume you have the following table:
>
>table_c
>id | name | grade
>---+--------+-------
>1 | Arnold | B-
>2 | John | A+
>2 | John | C
>5 | Jim | A
>
>To count how many grades each person has you'd use the following statement:
>
>select c.id,
> c.name,
> count(c.grade) -- or you could use "count(*)"
>from table_c c
>group by c.id,
> c.name
>order by c.id
>
>Basically this statements sellects all rows and groups them uniquely by
>the columns specified and then counts how many rows of that specific group
>exists. Instead of count() you also could use max(), min(), sum(),
>average(), ... to do other neat stuff with the group statement.
>
> Claus
>
>
>On 2/15/2005 9:29 AM, Scott Phillips wrote:
>>This isn't php, but php and SQL go hand-n-hand right?
>>Can someone explain to me how this sql query does what it does? It is
>>contained in a "news" class method that returns an array of news articles
>>plus a count of comments associated with each. I'm specifically
>>interested in the LEFT JOIN. I thought a LEFT JOIN returned rows where
>>there is no match between tables? (Or something like that.) How does
>>the "ON (c.news_id=n.news_id)" affect that?
>> $sql = "SELECT
>> n.news_id,
>> n.news_title,
>> n.news_article,
>> n.news_release_dt,
>> COUNT(c.news_comment_id) AS cmt_cnt
>> FROM
>> ".PREFIX."_news n
>> LEFT JOIN ".PREFIX."_news_comments c ON
>> (c.news_id=n.news_id)
>> WHERE
>> deleted=0
>> and status=1
>> and news_release_dt <= '".$sDate."'
>> and news_expire_dt > '".$sDate."'".$sFilter."
>> GROUP BY
>> n.news_id
>> ORDER BY
>> news_release_dt desc
>> LIMIT ".$iPage.", ".ROWCOUNT;
>>
>>Thanks!
>>Oh, and Chris, I *may* have a good place for future meetings. Let me
>>check on availability and I will contact you with details.
>>
>>
>>Scott Phillips
>>Web Developer
>>Cowles Library, Drake University
>>(515) 271-2975
>>_______________________________________________
>>ciapug mailing list
>>ciapug@cialug.org
>>http://cialug.org/mailman/listinfo/ciapug
>
>_______________________________________________
>ciapug mailing list
>ciapug@cialug.org
>http://cialug.org/mailman/listinfo/ciapug
Scott Phillips
Web Developer
Cowles Library, Drake University
(515) 271-2975