08. februar 2005 - 22:41Der 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.
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
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å ?
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
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
>> 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;
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!
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....
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
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
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
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
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.