Avatar billede trumf Nybegynder
08. februar 2005 - 22:41 Der er 17 kommentarer og
1 løsning

Hente fra DB

Hejsa E

Jeg sidder og nørkler med noget database og kan ikke lige finde ud af det...

Jeg har nogle tabeller: varer, ordrelog og ordredata
varer har varer, ordrelog har alle ordrelinier, dvs alle varer der er bestilt. En ordrelinie har bla ordreID, vareID og antal. ordredata har ordreID.

Nu vil jeg gerne have lavet en liste med andre varer som kunder købte, når de kigger på en bestemt vare.

Hvordan laver jeg lige den SQL der hiver det ud ?

På forhånd tak
Avatar billede eagleeye Praktikant
08. februar 2005 - 23:01 #1
Er det Access du bruger?

HVis det er kan det laves eksempelvis sådan her med en SQL sætning:

valgtVareId = 1

SQL = "SELECT distinct varer.VareNavn FROM ordrelog INNER JOIN varer ON ordrelog.vareID = varer.id WHERE ordrelog.ordreid in (select ordreid from ordrelog ol where ol.vareID="& valgtVareId & ") and ordrelog.vareID <> " & valgtVareId
Avatar billede trumf Nybegynder
09. februar 2005 - 02:03 #2
Ja, sorry... jeg skulle måske have sagt at det kører på en MySQL DB, så subqueries kan ikke bruges. (kører ikke med beta)

Select IN er naturligvis en løsning, men dur ikke her. Jeg havde selv tænkt på at lave en temp tbl, men mon ikke det kan lade sig gøre med noget SQL, som vi bare ikke har tænkt på ?
Avatar billede eagleeye Praktikant
09. februar 2005 - 17:04 #3
Ja det kan skrives på en anden måde prøv sådan her så:

SQL = "SELECT DISTINCT varer.VareNavn FROM ordrelog INNER JOIN varer ON ordrelog.vareID = varer.id, ordrelog ol WHERE ordrelog.ordreID = ol.ordreid AND ordrelog.vareID<>" & valgtVareId
Avatar billede trumf Nybegynder
09. februar 2005 - 17:25 #4
Her sætter du ordrelog.ordreID = ol.ordreid og ordrelog ol, så jeg går ud fra at den første er ordredata.

prøver det lige...
Avatar billede trumf Nybegynder
09. februar 2005 - 17:40 #5
Når jeg prøver:

SELECT DISTINCT varer.vID, varer.vnavn FROM ordrelog INNER JOIN varer ON ordrelog.vID = varer.vID, ordredata WHERE ordredata.ordrenr = ordrelog.unikOrdreNr AND ordrelog.vID <> 44

får jeg alt for mange resultater...

Denne virker, men der har jeg hentet de "rigtige" ordrenumre ud, måske du kan gennemskue det bedre:

SELECT DISTINCT varer.vnavn, varer.vid FROM ordrelog, varer WHERE varer.vid = ordrelog.vid AND (unikOrdreNr = 2867 OR unikOrdreNr = 2892) AND ordrelog.vid <> 44
Avatar billede eagleeye Praktikant
09. februar 2005 - 18:00 #6
>> Her sætter du ordrelog.ordreID = ol.ordreid og ordrelog ol, så jeg går ud fra at den første er ordredata.
JA det skal være ordrelog igen ikke ordredata

Prøv som jeg har vist den, det skulle gerne virke også med mySQL:

SQL = "SELECT DISTINCT varer.VareNavn, varer.vid FROM ordrelog INNER JOIN varer ON ordrelog.vID = varer.vid, ordrelog ol WHERE ordrelog.ordreID = ol.ordreid AND ordrelog.vID<>" & valgtVareId



Grunden til det er at: SELECT * FROM t1 WHERE id IN (SELECT id FROM t2);
Kan skrives som dette: SELECT DISTINCT t1.* FROM t1, t2 WHERE t1.id=t2.id;
Avatar billede eagleeye Praktikant
09. februar 2005 - 18:03 #7
Og da IN henter fra ordrelog: ordrelog.ordreid in (select ordreid from ordrelog ol where ol.vareID="& valgtVareId & ")

Det er til at få valgt alle vare med samme ordreID som den vare man søger efter.
Avatar billede trumf Nybegynder
09. februar 2005 - 20:16 #8
Det lyder også helt rigtigt det du siger, men det virker bare ikke &(%¤%&¤()/&(¤%#

Din SQL:

SELECT DISTINCT varer.vID, varer.vnavn FROM ordrelog INNER JOIN varer ON ordrelog.vID = varer.vid, ordrelog ol WHERE ordrelog.ordreID = ol.ordreid AND ordrelog.vID <> " & aktuelvID

Giver for mange resultater, så jeg prøvede en anden, og søreme om den giver samme resultat:

SELECT DISTINCT varer.vID, varer.vnavn FROM ordrelog ,varer WHERE ordrelog.vID = varer.vid AND ordrelog.vID <> " & aktuelvID

Begge SQL giver alle varene fra salgsloggen undtaget den aktuelle vare!
Avatar billede eagleeye Praktikant
09. februar 2005 - 22:19 #9
Hvilken version bruger du jeg har prøve et lille eks på min mySQL og der virker den umiddelbart fint.
Avatar billede eagleeye Praktikant
09. februar 2005 - 22:23 #10
Ok der mangler måske engenlig noget at den kun vælger de ordreID hvor varen er på. Så prøv lige sådan her:


SELECT DISTINCT varer.vID, varer.vnavn FROM ordrelog INNER JOIN varer ON ordrelog.vID = varer.vid, ordrelog ol WHERE ordrelog.ordreID = ol.ordreid AND ordrelog.vID <> " & aktuelvID & " AND ol.vid = " & aktuelvID
Avatar billede trumf Nybegynder
09. februar 2005 - 22:31 #11
Jeg kører 4.0.20a

Den giver slet ikke noget og jeg ved at den skulle give 3
Avatar billede trumf Nybegynder
09. februar 2005 - 22:34 #12
Jeg har også prøvet dette:

    SQLStrTmp = "SELECT DISTINCT unikOrdreNr FROM ordrelog WHERE vID = " & aktuelvID
    Set getTbl = Conn.Execute(SQLStrTmp)
        If Not getTbl.EOF Then
            Do While Not getTbl.EOF
                orderNumbers = orderNumbers & getTbl("unikOrdreNr") & ","
                getTbl.MoveNext
            Loop
            orderNumbers = Left(orderNumbers, Len(orderNumbers)-1)
        Else
            orderNumbers = 0
        End If
    Set getTbl = Nothing

SELECT DISTINCT v.vID, v.vnavn, v.harBillede, v.tilbudType, v.tilbudSats, v.pris, b.picnavn, b.height, b.width, SUM(ol.antal) AS bestAntal FROM varer v, ordrelog ol LEFT JOIN produktbilleder b ON v.vID = b.vID WHERE v.vID <> " & aktuelvID & " AND ol.unikOrdreNr IN (" & orderNumbers & ") GROUP BY v.vnavn ORDER BY bestAntal

Den giver alle varene... Jeg forstår det simpelthen ikke....
Avatar billede eagleeye Praktikant
09. februar 2005 - 22:45 #13
Nu har du en tabel mere på produktbilleder og en udregning sum. Den jeg har vist virker i mySQL som du du har beskrevet tabellerne i sprøgsmålet.

Hvis du bruger dit sidste forslag så prøv at lave den sådan her:

SELECT DISTINCT v.vID, v.vnavn, v.harBillede, v.tilbudType, v.tilbudSats, v.pris, b.picnavn, b.height, b.width, SUM(ol.antal) AS bestAntal FROM varer v, ordrelog ol LEFT JOIN produktbilleder b ON v.vID = b.vID WHERE v.vid=ol.vid AND v.vID <> " & aktuelvID & " AND ol.unikOrdreNr IN (" & orderNumbers & ") GROUP BY v.vnavn ORDER BY bestAntal
Avatar billede eagleeye Praktikant
09. februar 2005 - 22:46 #14
eller måske sådan her:

SELECT DISTINCT v.vID, v.vnavn, v.harBillede, v.tilbudType, v.tilbudSats, v.pris, b.picnavn, b.height, b.width, SUM(ol.antal) AS bestAntal FROM (varer v INNER JOIN ordrelog ol ON v.vid=ol.vid) LEFT JOIN produktbilleder b ON v.vID = b.vID WHERE v.vID <> " & aktuelvID & " AND ol.unikOrdreNr IN (" & orderNumbers & ") GROUP BY v.vnavn ORDER BY bestAntal
Avatar billede eagleeye Praktikant
09. februar 2005 - 22:57 #15
Her er den jeg har lavet nu tilpasset så den regner summen ud af antal og henter fra billede tabellen


SELECT varer.vID, varer.varenavn, sum(ordrelog.antal), b.picnavn FROM ((ordrelog INNER JOIN varer ON ordrelog.vID = varer.vid) LEFT JOIN ordrelog ol ON ordrelog.ordreID = ol.ordreid) LEFT JOIN produktbilleder b ON varer.vid = b.vid WHERE ordrelog.vID <> " & aktuelvID & " AND ol.vid = "& aktuelvID &" GROUP BY varer.varenavn, varer.vID
Avatar billede trumf Nybegynder
09. februar 2005 - 22:59 #16
Jeg har kørt dine forslag uden det med billederne. Jeg bygger det ind i din, når jeg får den til at virke.

Denne kører bare med klatten :-)
SELECT DISTINCT v.vID, v.vnavn, v.harBillede, v.tilbudType, v.tilbudSats, v.pris, b.picnavn, b.height, b.width, SUM(ol.antal) AS bestAntal FROM varer v, ordrelog ol LEFT JOIN produktbilleder b ON v.vID = b.vID WHERE v.vid=ol.vid AND v.vID <> " & aktuelvID & " AND ol.unikOrdreNr IN (" & orderNumbers & ") GROUP BY v.vnavn ORDER BY bestAntal
Avatar billede trumf Nybegynder
09. februar 2005 - 23:05 #17
Den sidste du lavede kan jeg ikke få til at give noget....

Men den lige før virker efter hensigten, så skal vi ikke bare stoppe her og sige at du har tjent dine point.

Du har ydet en super indsats tak for det ;-)
Avatar billede eagleeye Praktikant
09. februar 2005 - 23:06 #18
Ok :)
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