Avatar billede bobbedude Nybegynder
23. januar 2003 - 10:16 Der er 11 kommentarer og
1 løsning

List kun kategorier med indhold

Jeg har et script til at liste kategorier og indhold med, problemet er at den lister alle kategorier også hvis kategorien ikke indeholder nogen produkter.


SQL = "SELECT * FROM tilbudKategori"
SET rs = Connect.Execute(SQL)

if not rs.EOF then
do until rs.EOF


if Cint(Request.QueryString("linkid")) = rs("katID") then
%>
<a class="link1" href="bygma-tilbud.asp?menu=2"><b><%=rs("katNavn")%></b></a><br>
<%
else
%>
<a class="link1" href="bygma-tilbud.asp?linkid=<%=rs("katID")%>&menu=<%=request.querystring("menu")%>"><%=rs("katNavn")%></a><br>
<%
end if


if Cint(Request.QueryString("linkid")) = rs("katID") then

Set rs2 = Connect.Execute("SELECT * FROM tilbudVare WHERE uge = "&uge&" AND katID = " & request("linkid") & " Order by priotet asc")


if not rs2.EOF then
do until rs2.EOF
%>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
  <tr>
    <td class="almfont">&middot;&nbsp;<a class="link1" href="bygma-tilbud.asp?id=<%=rs2("vareID")%>&menu=<%=request.querystring("menu")%>&show=1">
    <%
    if rs2("priotet")="A" then
    response.write "<b>"
    end if
    %>
    <%=rs2("varenavn")%>
    <%
    if rs2("priotet")="A" then
    response.write "</b>"
    end if
    %></a>
    </td>
    <td align="right" class="almfont"><%=formatcurrency(rs2("tilbudpris"),2)%></td>
    <td width="100">&nbsp;</td>
  </tr>
</table>
<%
rs2.MoveNext
Loop
rs2.close
else
'fang tom
end if

end if
rs.movenext
Loop
rs.close
else
'fang tom
end if

Jeg vil kun have de kategorier ud der indeholder produkter.
Avatar billede _darkstar_ Nybegynder
23. januar 2003 - 10:34 #1
Det kan du gøre med IN.
Avatar billede medions Nybegynder
23. januar 2003 - 10:35 #2
Set rs2 = Connect.Execute("SELECT * FROM tilbudVare WHERE uge = "&uge&" AND katID = " & request("linkid") & " AND VareNavn <> "" Order by priotet asc")

//>Rune
Avatar billede eagleeye Praktikant
23. januar 2003 - 10:35 #3
Så lave denne om så den hednter katagoier og kun medtager kategorien hvis den findes i den tabel som indeholder vare hvor uge = den valgte uge:

SQL = "SELECT * FROM tilbudKategori"

Til denne SQL:

SQL = "SELECT DISTINCT tilbudKategori.katID, tilbudKategori.katNavn FROM tilbudKategori INNER JOIN tilbudVare ON tilbudKategori.katID = tilbudVare.katID WHERE tilbudVare.uge = " & uge & ";"
Avatar billede _darkstar_ Nybegynder
23. januar 2003 - 10:35 #4
SELECT * FROM tilbudKategori WHERE katID IN (SELECT katID FROM tilbudVare WHERE uge = <ugen>)
Avatar billede _darkstar_ Nybegynder
23. januar 2003 - 10:38 #5
eagleeyes join ovenfor kan altså godt være langsommere at køre. Hvis du ikke er enig i det, så smid en kommentar ind her, eagleeye.
Avatar billede eagleeye Praktikant
23. januar 2003 - 10:41 #6
Det er muligt den er langsommere end 1 select, men er 1 JOIN langsommere end 2 SELECT??

Hvis vi skal diskutere hastighed så undgå at bruger * efter select men skriv de kolonne nanve som er nødvendige...
Avatar billede eagleeye Praktikant
23. januar 2003 - 10:43 #7
Jeg syntes nu ikke jeg har oplevet JOIN som værene speciel langsom, ikke når det er en så simpel JOIN.


Jeg har også altid fået at vide IN er total langsom at udføre.
Avatar billede eagleeye Praktikant
23. januar 2003 - 10:49 #8
Jeg vil dog forsvare min ved at hvis der ikke er nogle kategorier som indeholder vare en uge så vil IN med en tom () give en syntax fejl hvorimod min SQL sætning vil give et tomt recordset.

katID IN ()    <--- giver syntax fejl og man vil se en fejl side.
Avatar billede _darkstar_ Nybegynder
23. januar 2003 - 10:54 #9
Det er fordi at IN-operatoren sorterer dubletter i feltet katID fra før at der sker en sammenligning. Dit JOIN tvinger den til at fremstille et meget stort resultat, som den først derefter fjerner dubletter fra.

Det kommer dog an på hvilket system, det drejer sig om, da det i sidste ende afhænger af databasens query analyzer.

Hvad angår din kommentar med een kontra to SELECT-sætninger, så sker der dybest set det samme - vi kigger i to tabeller. Derfor bør det ikke have indflydelse på performace.

Det som man ofte taler om ifm. mange SELECT-sætninger er når man sender mange separate SELECT-forespørgsler til databasen, hvilket belaster serveren fordi de netop udgør separate forespørgsler.
Avatar billede _darkstar_ Nybegynder
23. januar 2003 - 10:56 #10
Det med det tomme resultat tror jeg altså ikke på. Jeg har dog ikke nogen databaseserver ved hånden, så jeg kan ikke afprøve det.

Skal vi vædde på at det virker selvom at resultatet er tomt? Jeg stiller 200 point på højkant.
Avatar billede bobbedude Nybegynder
23. januar 2003 - 11:16 #11
eagleeye >> Som altid perfekt
Avatar billede eagleeye Praktikant
23. januar 2003 - 11:26 #12
Det er en god kommentar du er kommet med, jeg tror det er svært at generaliser da det vil afhænge af databasen og hvordan den arbejder. Jeg ved ikke hvordan databasen query analyser virker jeg kan kun gætte på hvad der sker.

"een kontra to SELECT-sætninger" Select'en i IN udføres først og så udføres den uden om, det giver to select. Ja Ok join vil bliver større end nødvendig før der sorteres fra, og dermed går der mere tid.

Jeg har herller ikke mulighed for at teste lige nu, anden end i Access Query-builder og den giver syntas fejl ved IN (). Det er muligt den udadtil via ADO vil give et tomt recordet uden at melde fejl, det må komme an på en prøve senere i dag.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester