Avatar billede Slettet bruger
16. april 2010 - 13:23 Der er 17 kommentarer

SQL sætning med inner join

Jeg har følgende sætning som ikke virker efter hensigten.

Ideen er at den skal hente alle produkterne fra en given kategori samt alle produkter som er specielle for den givne bruger.

Jeg har følgende tabeller i spil:
Produkter (En liste med produkter)
Produkt_kunder (En liste med produktID samt BrugerID)

Opgaven den skal udføre er:

1) At hente alt fra tabellen produkter hvor Kategori = request.querystring("Kategori").

2) Hente alt fra Produkter hvor Produkter.ID = Produkt_kunder.ProduktID og Produkt_kunder.CustomerID = session("BrugerID")
Avatar billede Slettet bruger
16. april 2010 - 13:25 #1
Den spæde start som ikke virker:

SELECT * FROM Produkter INNER JOIN Produkter_kunder ON Produkter.Id = Produkter_kunder.ProduktID where Produkter.Kategori = "&request.querystring("")&";
Avatar billede softspot Forsker
16. april 2010 - 13:36 #2
Er kategori en tekst eller et tal?

Hvis det er en tekst, så skal der apostroffer omkring parameteren:

sql = "SELECT * " & _
      "FROM Produkter " & _
      "INNER JOIN Produkter_kunder ON Produkter.Id = Produkter_kunder.ProduktID " & _
      "WHERE Produkter.Kategori = '" & request.querystring("kategori") & "'"
Avatar billede softspot Forsker
16. april 2010 - 13:37 #3
Det er naturligvis bedre at benytte parameteriserede forespørgsler, som du kan læse lidt om her: http://www.eksperten.dk/guide/1250
Avatar billede Slettet bruger
16. april 2010 - 13:44 #4
Øh er det reklame for din guide eller hjælp til mit spørgsmål???
Avatar billede Slettet bruger
16. april 2010 - 13:45 #5
soooory så ikke comment # 2
Avatar billede Slettet bruger
16. april 2010 - 13:46 #6
Kategori er et tal men det er ikke det der er galt...

det er en hel anden forespørgsel der skal til. Lige nu henter den jo kun alle produkter som er Brugerspecifikke og ikke resten hvor Kategori = request.....
Avatar billede softspot Forsker
16. april 2010 - 13:50 #7
Nej, jeg vil jo påstå at den henter alle kategorispecifikke, men ikke brugerspecifikke. De returnerede rækker bliver brugerspecifikke ved at tilføje en betingelse mere:

sql = "SELECT * " & _
      "FROM Produkter " & _
      "INNER JOIN Produkter_kunder ON Produkter.Id = Produkter_kunder.ProduktID " & _
      "WHERE Produkter.Kategori = " & request.querystring("kategori") & " " & _
      "AND Produkt_kunder.CustomerID = " & session("BrugerID")
Avatar billede softspot Forsker
16. april 2010 - 13:53 #8
Nå OK, der var lige en tastefejl i det kode jeg klippede fra dit spørgsmål, så det skal nok være:

sql = "SELECT * " & _
      "FROM Produkter " & _
      "INNER JOIN Produkter_kunder ON Produkter.Id = Produkter_kunder.ProduktID " & _
      "WHERE Produkter.Kategori = " & request.querystring("kategori") & " " & _
      "AND Produkter_kunder.CustomerID = " & session("BrugerID")
Avatar billede softspot Forsker
16. april 2010 - 14:00 #9
Hmm... du har vist brug for to forespørgsler og ikke én.

Den der henter alle produkter i en kategori:

sql = "SELECT * FROM produkter WHERE kategori = " & request.querystring("kategori")


Den der henter alle produkter specifikke for en bruger:

sql = "SELECT Produkter.* " & _
      "FROM Produkter " & _
      "INNER JOIN Produkter_kunder ON Produkter.Id = Produkter_kunder.ProduktID " & _
      "WHERE Produkter_kunder.CustomerID = " & session("BrugerID")
Avatar billede Slettet bruger
16. april 2010 - 14:07 #10
Ja det var jeg også bange for...

Er der en måde man kan gøre det før således at jeg kan bruge samme recordset til at skrive det ud med???
Avatar billede softspot Forsker
16. april 2010 - 14:16 #11
Ehm... du har formuleret det som om du har brug for to forskellige resultater, men det hænger ikke helt sammen med at du vil skrive dem ud fra samme resultat. Er der i virkeligheden tale om at du vil have alle produkter i en given kategori som er knyttet til en given kunde?`I så fald skal du benytte SQL-sætningen fra indlæg #8.

Hvis det er noget andet du vil, så må du lige forklare lidt mere om hvad det er du forsøger at lave.
Avatar billede softspot Forsker
16. april 2010 - 14:16 #12
"Kunde" er så det samme som "bruger" i denne sammenhæng ;-)
Avatar billede Slettet bruger
16. april 2010 - 14:24 #13
Jeg vil gerne have at den skriver alle produkter ud fra en given kategori (request.querystring("Kategori")) samt de produkter der i selvsamme kategori også er koblet sammen med den bruger der er logget ind.

Bruger relaterede produkter må kun vises hvis den pågældende bruger er logget ind.

Giver det mening?
Avatar billede softspot Forsker
16. april 2010 - 14:32 #14
Ja, men så er behovet, såvidt jeg kan se, ikke at det ligger i samme resultat (recordset), men at du kalder databasen med forskellige SQL-sætninger alt efter om brugeren er logget ind eller ej. Det klarer du vel bare med en if-sætning:

if isempty(session("BrugerID")) then
  ' brugeren er ikke logget ind
  sql = "SELECT * " & _
        "FROM produkter " & _
        "WHERE kategori = " & request.querystring("kategori")
else
  sql = "SELECT * " & _
        "FROM Produkter " & _
        "INNER JOIN Produkter_kunder ON Produkter.Id = Produkter_kunder.ProduktID " & _
        "WHERE Produkter.Kategori = " & request.querystring("kategori") & " " & _
        "AND Produkter_kunder.CustomerID = " & session("BrugerID")
end if
set rs = conn.Execute(sql)
' ... gennemløb resultatet og udskriv produkt-info ...
rs.close
conn.close
Avatar billede softspot Forsker
16. april 2010 - 14:50 #15
Hvis du ALTID vil have listen med produkter udskrevet og så i de tilfælde hvor brugeren er logget ind og vil have dennes produkter udskrivet nedenunder (eller i en ny liste et andet sted på siden), så skal du (i princippet) udføre to kald til databasen. Noget á la dette:

sql = "SELECT * " & _
      "FROM produkter " & _
      "WHERE kategori = " & request.querystring("kategori")
set rs = conn.Execute(sql)
' ... gennemløb resultatet og udskriv produkt-info ...
rs.close

if not isempty(session("brugerid")) then
  sql = "SELECT * " & _
        "FROM Produkter " & _
        "INNER JOIN Produkter_kunder ON Produkter.Id = Produkter_kunder.ProduktID " & _
        "WHERE Produkter.Kategori = " & request.querystring("kategori") & " " & _
        "AND Produkter_kunder.CustomerID = " & session("BrugerID")
  set rs = conn.Execute(sql)
  ' ... gennemløb resultatet og udskriv produkt-info ...
  rs.close
  conn.close
end if


Jeg er godt nok noget i tvivl om hvordan dine data er skruet sammen, for det kunne også godt forstås således, at din produktdatabase indeholder et sæt produkter som er generelle og så nogle produkter som kun er synlige for enkelte kunder. Hvis dette er tilfældet, så skal du over i en lidt anden forspørgsel. Den kunne se således ud:

if isempty(session("BrugerID")) then
  ' brugeren er ikke logget ind, så udtræk de produkter der
  ' IKKE er tilknyttet nogen kunder
  sql = "SELECT * " & _
        "FROM Produkter " & _
        "LEFT JOIN Produkter_kunder ON Produkter.Id = Produkter_kunder.ProduktID " & _
        "WHERE Produkter.Kategori = " & request.querystring("kategori") & " " & _
        "AND NOT EXISTS (" & _
          "SELECT * " & _
          "FROM Produkter_kunder " & _
          "WHERE ProduktID = Produkter.Id " & _
        ")"
else
  ' find alle produkter der ikke har nogen kunder tilknyttet
  ' eller som har den aktuelle kunde tilknyttet
  sql = "SELECT * " & _
        "FROM Produkter " & _
        "LEFT JOIN Produkter_kunder ON Produkter.Id = Produkter_kunder.ProduktID " & _
        "WHERE Produkter.Kategori = " & request.querystring ("kategori") & " " & _
        "AND (" & _
          "Produkter_kunder.CustomerID = " & session("BrugerID") & " " & _
          "OR Produkter_kunder.CustomerID IS NULL " & _
        ")"
end if
set rs = conn.Execute(sql)
' ... gennemløb resultatet og udskriv produkt-info ...
rs.close
conn.close
Avatar billede Slettet bruger
16. april 2010 - 14:48 #16
Ja jeg tror også resultatet må blive to sql...

men da brugeren altid er logget ind er det ikke enten eller men både og...

smid et svar så lukker jeg spørgsmålet

Tak for det.
Avatar billede softspot Forsker
16. april 2010 - 19:39 #17
:-)
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



Seneste spørgsmål Seneste aktivitet
I går 23:37 Poe strøm Af lurup i LAN/WAN
I går 14:46 GIF-EDITOR Af snestrup2000 i Billedbehandling
I går 14:03 Logge ind Af Bob i PC
I går 12:12 2 skærme - 1 virker - den anden siger No signal Af eksmojo i Skærme
I går 10:33 openvpn projekt Af dcedata1977 i Windows