For Anand: Help with list and query

Thanks to Anand from my last question, I am hoping he or someone else can help me with this to finish it off.

This refers back to this question:
http://experts-exchange.com/Web/WebDevSoftware/ColdFusion/Q_20797355.html

So now I just want to know when i click on the category(http://www.jhasim.net/example_categories.jpg)
how can i sort through the single records and lists to only show the correct ID number, for instance in the the SQL image, ID 17.(http://www.jhasim.net/example_showcategories.jpg)

So basically, all i need to know now is how can i show all the programs that belong in a particular category when its ID is in a list.


Here is the code below that works fine when i was just showing 1 ID in the category field and not having a list:


<cfquery name="getPrograms" datasource="#DataTables#">
SELECT [Zone].ZoneID, [Zone].ZoneName, CMEPrograms.CMEProgramID, CMEPrograms.CMEProgramName, CMEPrograms.CMEProgramTagline, CMEPrograms.CMEProgramDate, CMEPrograms.CMEProgramCategory, CMEPrograms.CMEProgramVolume, CMEPrograms.CMEProgramNumber, year(CMEPrograms.CMEProgramDate) AS DateYear, month(CMEPrograms.CMEProgramDate) AS DateMonth
FROM CMEPrograms INNER JOIN [Zone] ON CMEPrograms.CMEProgramCategory = [Zone].ZoneID
WHERE CMEPrograms.CMEProgramCategory = #URL.ID#
Order By DateYear DESC, DateMonth DESC
</cfquery>

<TABLE width="100%" border="0" cellpadding="0" cellspacing="0">
      <TR>
        <TD class="TDtitle">&nbsp;ShowPrograms</TD>
      </TR>
      <TR>
        <TD>
<TABLE width="100%" border="0">
  <TR align="center">
    <TD colspan="4" class="TDdashed">Text Goes Here</TD>
  </TR>

  <TR>
    <TD colspan="4">&nbsp;</TD>
  </TR>
  <TR>
    <TD colspan="4" class="issueCategoryText"><CFOUTPUT>#getPrograms.ZoneName#</CFOUTPUT></TD>
  </TR>
  <TR>
    <TD colspan="4">
     <table width="100%">
     <cfoutput query="getPrograms" group="DateYear">
      <tr>
       <td class="TDTitle" colspan="2">&nbsp;#DateYear# Programs</td>
      </tr>
      <cfoutput>
      <tr>
      <td class="issueHeaderText" colspan="2"><a href="template.cfm?TEMPLATE=include_program.cfm&ID=#CMEProgramID#&PageName=#CMEProgramName#">#CMEProgramName#</a></td>
      </tr>
      <tr>
      <td class="secondary" colspan="2"><STRONG>#CMEProgramTagline#</STRONG></td>
      </tr>
      <tr>
      <td class="normaltextreg"><STRONG>Program Date:</STRONG> #Dateformat(CMEProgramDate, 'MMMM YYYY')#<cfif CMEProgramVolume GT 0 AND CMEProgramNumber GT 0> - <STRONG>Program Info:</STRONG> Volume #CMEProgramVolume#, (#CMEProgramNumber#)</cfif></td>
      <td class="normaltextreg"></td>
      </tr>
      <tr><td colspan="2">&nbsp;</td></tr>
      </cfoutput>
      </cfoutput>
     </table>
     </TD>
  </TR>
</TABLE>
jeffmaceAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

shooksmCommented:
Can you change the design of the database?  Having a single column defining your category relationships is not normalized.  You should have a seperate table that acts as a bridge table or many to many type of relationship.  It should containt the primary key for your Zone table and the primary key for your CMEProgramCategory table.  This would allow you do simply join the two tables based on that bridge table.

Option 2.  A real simple way to implement lists in a SQL column is to make sure you prefix and suffix the field with the delimeter.  IE, instead of

9,1,3

you would have

,9,1,3,

At that point, you can use the following in your where statement:

WHERE CMEPrograms.CMEProgramCategory LIKE('%#URL.ID#%')

Although this will work, because of the wildcards being on both sides of the string, if an index exists, it will be ignored.

Again, your best bet is to get the database design fixed.  Less problems down the rode the next time you have to add functionality.
0
shooksmCommented:
Oops, here is a correction to the where statement as I forgot the delimeters:

WHERE CMEPrograms.CMEProgramCategory LIKE('%,#URL.ID#,%')
0
anandkpCommented:
hmmm using :
WHERE CMEPrograms.CMEProgramCategory LIKE('%,#URL.ID#,%')

wld avoid the entries with just "17" as the value

this shld do the job - use CFQueryparam for added advantages !

<cfquery name="getPrograms" datasource="#DataTables#">
SELECT [Zone].ZoneID, [Zone].ZoneName, CMEPrograms.CMEProgramID, CMEPrograms.CMEProgramName, CMEPrograms.CMEProgramTagline, CMEPrograms.CMEProgramDate, CMEPrograms.CMEProgramCategory, CMEPrograms.CMEProgramVolume, CMEPrograms.CMEProgramNumber, year(CMEPrograms.CMEProgramDate) AS DateYear, month(CMEPrograms.CMEProgramDate) AS DateMonth
FROM CMEPrograms INNER JOIN [Zone] ON CMEPrograms.CMEProgramCategory = [Zone].ZoneID
WHERE CMEPrograms.CMEProgramCategory LIKE <cfqueryparam CFSQLTYPE="CF_SQL_VARCHAR" VALUE="%#URL.ID#%">
Order By DateYear DESC, DateMonth DESC
</cfquery>

HTH

let me know

K'Rgds
Anand
0
Get expert help—faster!

Need expert help—fast? Use the Help Bell for personalized assistance getting answers to your important questions.

shooksmCommented:
Negative, not if you put the delimeters around single values too.  The problem with yours is that 17 is also in 117, 1700 or any other possible number with 17 in it.  That is why a delimeter is needed at the begining and ending of each value.  But as I said earlier, this is just a bandaid on a bigger problem of a bad database design.
0
jeffmaceAuthor Commented:
I addressed the bad database design.  As stated in my previous question I altered it to no point to another table to look for the categories.  But what I was still looking to do was see if it is possilbe to do a query based on lists in a cell.  Thats all.
0
anandkpCommented:
depending on what is the maximum no of categories u have - lets say 9999

u can modify teh "where" condition as :

WHERE CMEPrograms.CMEProgramCategory LIKE (<CFQUERYPARAM CFSQLTYPE="CF_SQL_VARCHAR" VALUE="%#URL.ID#%">)
(
<CFLOOP INDEX="i" FROM="0" TO="99">
      And Not like (<CFQUERYPARAM CFSQLTYPE="CF_SQL_VARCHAR" VALUE="%#i##URL.ID#%">)
      And Not like (<CFQUERYPARAM CFSQLTYPE="CF_SQL_VARCHAR" VALUE="%#URL.ID##i#%">)
</CFLOOP>
And Not like (<CFQUERYPARAM CFSQLTYPE="CF_SQL_VARCHAR" VALUE="%#URL.ID#00%">)
)

& it wld only get u the ones with 17 in it - avoiding all the other possible combinations

HTH - run the query to chk if it solves the requirement ... it shld :)

K'Rgds
Anand
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Web Servers

From novice to tech pro — start learning today.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.