Solved

Counting Query

Posted on 2002-04-12
7
210 Views
Last Modified: 2013-12-24
I'm working on a web based IT knowledbase type app for my personal use. I'm trying to accomplish something I have seen on other websites. I have a DB with two tables. One table has all the different categories and their category id, and the other table has a the actual content, category ID, etc. (Look at the attached code below and look at the CFQUERY pulling out of the KNOWLEDGEBASE table or download a copy of this DB here: http://www.georgelemos.com/glkb.zip)

If you go to http://www.georgelemos.com/categories.cfm you will see the template I am working on. You'll notice the (4) next to each category. What I want to do, is query the KNOWLEDGEBASE table and count how many articles I have stored in the DB for each CATEGORY. Then next to each category have a number displaying how many articles for that CATEGORY are stored in the DB.

I have tried a few different ways but I really came up with nothing that works. Right now all its doing is displaying how many entries are in cetegory 1 (which are 4) I am assuming there's some type of CFLOOP needed which I am really awful with.

If someone has a piece of code available that could help me out I would greatly appreciate it. The code below is what I have running on the page URL listed above.

Thanks!

<CFQUERY NAME="CATZ" DATASOURCE="GLKB">
   Select CATID, CATEGORY
   From CATEGORIES
   Order By CATEGORY
</CFQUERY>



<CFQUERY NAME="NUMZ" DATASOURCE="GLKB">
  SELECT CATEGORIES.CATEGORY, CATEGORIES.CATID, (SELECT Count(*)
  FROM KNOWLEDGEBASE where KNOWLEDGEBASE.CATEGORY = CATEGORIES.CATID) AS CategoryCount
  FROM CATEGORIES;
</CFQUERY>









<HTML>
<HEAD>
 <TITLE>Categories</TITLE>
 <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
 <LINK REL="stylesheet" HREF="glcss.css" TYPE="TEXT/CSS">
</HEAD>






<TABLE WIDTH="525" CELLSPACING="3" CELLPADDING="3">
<TR>                                          
<CFOUTPUT QUERY="CATZ">
<TD><A HREF="catpage.cfm?CATID=#CATZ.CATID#">#CATZ.CATEGORY#</A> (#NUMZ.CategoryCount#)<BR>
</TD>
<CFIF CATZ.CURRENTROW MOD 2 IS 0>
</TR>
<TR>
</CFIF>
</CFOUTPUT>
</TABLE>


</BODY>
</HTML>
0
Comment
Question by:gplemos
  • 3
  • 2
  • 2
7 Comments
 
LVL 19

Expert Comment

by:cheekycj
ID: 6936900
<CFQUERY NAME="CATZ" DATASOURCE="GLKB">
  Select CATID, CATEGORY
  From CATEGORIES
  Order By CATEGORY
</CFQUERY>

<cfloop query="CATZ">
<CFQUERY NAME="NUMZ" DATASOURCE="GLKB">
 SELECT CATEGORIES.CATEGORY, CATEGORIES.CATID, COUNT(*) AS CategoryCount
FROM KNOWLEDGEBASE, CATEGORIES where KNOWLEDGEBASE.CATEGORY = CATZ.CATID
AND CATEGORIES.CATID = KNOWLEDGEBASE.CATEGORY
</CFQUERY>
</cfloop>

should work.

Just use the query numz now to display the stuff like:

<cfoutput query="NUMZ">
#NUMZ.CATEGORY# (#NUMZ.CategoryCount#)<br>

CJ
0
 
LVL 19

Expert Comment

by:cheekycj
ID: 6936904
oops forgot the ending </cfoutput>:
<cfoutput query="NUMZ">
#NUMZ.CATEGORY# (#NUMZ.CategoryCount#)<br>
</cfoutput>

0
 
LVL 1

Accepted Solution

by:
ndintenfass earned 100 total points
ID: 6937437
Looping over a query, though, can be "expensive" overhead.  You can accomplish this in one query like this:

<CFQUERY NAME="CATZ" DATASOURCE="GLKB">
  Select     CATEGORIES.CATID,
                 CATEGORIES.CATEGORY,
               COUNT(KNOWLEDGEBASE.CATEGORY) As CategoryCount
               
  From           KnowledgeBase RIGHT JOIN CATEGORIES ON KNOWLEDGEBASE.CATEGORY = CATEGORIES.CATID
 
  GROUP BY      CATEGORIES.CATID,CATEGORIES.CATEGORY
 
  Order By      CATEGORIES.CATEGORY
</CFQUERY>

<HTML>
<HEAD>
<TITLE>Categories</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<LINK REL="stylesheet" HREF="glcss.css" TYPE="TEXT/CSS">
</HEAD>

<TABLE WIDTH="525" CELLSPACING="3" CELLPADDING="3">
<TR>                                          
<CFOUTPUT QUERY="CATZ">
<TD><A HREF="catpage.cfm?CATID=#CATZ.CATID#">#CATEGORY#</A> (#CategoryCount#)<BR>
</TD>
<CFIF CATZ.CURRENTROW MOD 2 IS 0>
</TR>
<TR>
</CFIF>
</CFOUTPUT>
</TABLE>


</BODY>
</HTML>


OR, if you want only the categories that do have entries in the knowledge base, you can simply have the query be:


  Select     CATEGORIES.CATID,
                 CATEGORIES.CATEGORY,
               COUNT(KNOWLEDGEBASE.CATEGORY) As CategoryCount
  From           CATEGORIES,
                 KNOWLEDGEBASE
  WHERE          KNOWLEDGEBASE.CATEGORY = CATEGORIES.CATID
  GROUP BY      CATEGORIES.CATID,CATEGORIES.CATEGORY
  Order By      CATEGORIES.CATEGORY
0
Complete VMware vSphere® ESX(i) & Hyper-V Backup

Capture your entire system, including the host, with patented disk imaging integrated with VMware VADP / Microsoft VSS and RCT. RTOs is as low as 15 seconds with Acronis Active Restore™. You can enjoy unlimited P2V/V2V migrations from any source (even from a different hypervisor)

 
LVL 19

Expert Comment

by:cheekycj
ID: 6937474
>Looping over a query, though, can be "expensive" overhead

true but it really does depend on the data set.

If the categories is under like 500 .. its probably
fine performance wise.

CJ
0
 

Author Comment

by:gplemos
ID: 6937520



Using the code below on URL:
http://www.georgelemos.com/categories2.cfm

I get the error:

"ODBC Error Code = 37000 (Syntax error or access violation)
[Microsoft][ODBC Microsoft Access Driver] You tried to execute a query that does not include the specified expression 'CATEGORY' as part of an aggregate function.



The error occurred while processing an element with a general identifier of (CFQUERY), occupying document position (8:1) to (8:39)."


Any suggestions?













<CFQUERY NAME="CATZ" DATASOURCE="GLKB">
 Select CATID, CATEGORY
 From CATEGORIES
 Order By CATEGORY
</CFQUERY>

<cfloop query="CATZ">
<CFQUERY NAME="NUMZ" DATASOURCE="GLKB">
SELECT CATEGORIES.CATEGORY, CATEGORIES.CATID, COUNT(*) AS CategoryCount
FROM KNOWLEDGEBASE, CATEGORIES where KNOWLEDGEBASE.CATEGORY = CATZ.CATID
AND CATEGORIES.CATID = KNOWLEDGEBASE.CATEGORY
</CFQUERY>
</cfloop>







<HTML>
<HEAD>
<TITLE>Categories</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<LINK REL="stylesheet" HREF="glcss.css" TYPE="TEXT/CSS">
</HEAD>






<cfoutput query="NUMZ">
#NUMZ.CATEGORY# (#NUMZ.CategoryCount#)<br>
</cfoutput>



</BODY>
</HTML>
0
 
LVL 1

Expert Comment

by:ndintenfass
ID: 6937757
I think you need a GROUP BY clause in the query (see my comment from above about doing it all in one query -- same idea)
0
 

Author Comment

by:gplemos
ID: 6940381
That did the trick. Thank you to both of you.
0

Featured Post

Do You Know the 4 Main Threat Actor Types?

Do you know the main threat actor types? Most attackers fall into one of four categories, each with their own favored tactics, techniques, and procedures.

Join & Write a Comment

A web service (http://en.wikipedia.org/wiki/Web_service) is a software related technology that facilitates machine-to-machine interaction over a network. This article helps beginners in creating and consuming a web service using the ColdFusion Ma…
Most ColdFusion developers get confused between the CFSet, Duplicate, and Structcopy methods of copying a Structure, especially which one to use when. This Article will explain the differences in the approaches with examples; therefore, after readin…
Excel styles will make formatting consistent and let you apply and change formatting faster. In this tutorial, you'll learn how to use Excel's built-in styles, how to modify styles, and how to create your own. You'll also learn how to use your custo…
This video demonstrates how to create an example email signature rule for a department in a company using CodeTwo Exchange Rules. The signature will be inserted beneath users' latest emails in conversations and will be displayed in users' Sent Items…

762 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

17 Experts available now in Live!

Get 1:1 Help Now