Avatar billede Oakster Nybegynder
12. april 2015 - 13:18 Der er 8 kommentarer og
1 løsning

-hele tuplen ud fra en enkelt attribut?

Beklager hvis I mener det er redundant med tidligere, men jeg er blevet så rusten i SQL at jeg er nødt til lidt specifik hjælp...

Jeg vil bygge en liste af aktive auktionItems, dette gør jeg med et loop. For hvert auktionItem ønsker jeg at finde det højeste bud i tabellen auctionBid, samt finde ejeren til dette bud.

Table auctionItem
AID        integer
aIdItem        integer
aPriceSelling    integer
aPriceIncrease    integer
...

Create table auctionBid
BID        integer
bIdItem        integer
bIdUser        integer
bBidAmount     integer

Hvis jeg f.eks gør sådan her (2 er fra loop i auctionItem))
SELECT bIDItem, Max(bBidAmount)
FROM auctionBid
WHERE bIDItem = 2
GROUP BY bIDItem

Får jeg det højeste bud og det aktuelle item, men ikke resten af tuplen som f.eks bIDUser, som jeg skal bruge til at validere om man må byde igen eller ejer buddet.

Såsnart jeg begynder at tilføje attributter til min forespørgsel, får jeg, afhængingt af hvordan jeg roder, forskellige typer af fejl. Og må vist hellere kaste håndklædet i ringen, og spørge lidt rundt. Er der nogen der har forslag til, hvordan jeg finder indholdet i tuplen med det højeste bud, for det specifikke item?
Avatar billede Oakster Nybegynder
12. april 2015 - 15:20 #1
Kom på en løsning, som jeg smider som svar uden dog at acceptere det...

SELECT *
From auctionBid b1
WHERE b1.bIDItem = 2
AND bBidAmount =
(SELECT MAX(bBidAmount)
FROM auctionBid b2
WHERE b1.bIDItem = 2)

-for hvis der kommer svar som er mere optimalt, eller en forklaring på hvad det er jeg bør gøre -så får vedkommende pointene.

PS: Jeg skal nok lukke den om et par dage, uanset hvad der sker.
Avatar billede Oakster Nybegynder
14. april 2015 - 10:44 #2
Ja ovennævnte virkede så egentlig ikke, eller mon det er i mit ydre loop at jeg ikke får styr på sagerne. For jeg får ikke det ønskede output, men kun det allerhøjeste af alle bud -selvom den fanger at jeg ikke har ejerskab på de andre...

http://prntscr.com/6tjqqv

Kunne være jeg skulle skrotte løsningen, og starte helt forfra med ydre/indre loop :/
Avatar billede gnoname Praktikant
15. april 2015 - 08:37 #3
Du selecter max(bBidAmount) fra b2, men begrænser kun på b1. Dvs. du får så bare max(bBidAmount) fra tabellen.

Prøv følgende:

SELECT *
From auctionBid b1
WHERE b1.bIDItem = 2
AND bBidAmount =
(SELECT MAX(bBidAmount)
FROM auctionBid b2
WHERE b2.bIDItem = b1.bIDItem)
Avatar billede Oakster Nybegynder
15. april 2015 - 10:51 #4
@gnoname, tak for det.

Jeg er der næsten, men såsnart at der findes et bud fra mig (81) på et item -så får jeg ejerskab.

Var selv nået frem til følgende SQL;
sql2 = "SELECT * From auctionBid b1 WHERE b1.aIDItem = " & thisItem & " AND aBidAmount = (SELECT MAX(aBidAmount) FROM auctionBid b2 WHERE b2.aIDItem = " & thisItem & " )"

Der giver mig samme output som dit forslag;
http://prntscr.com/6tyfzy

Jeg burde dog kun 'eje' item 22432 ud fra de bud der er afgivet;
http://prntscr.com/6tygbm

Her er den kode jeg har lavet til udtrækket;
if (rs.eof) then
response.write "<tr><td class=center>" & MsgListEmpty & "</td></tr>"
else
'list building loop
while not rs.eof
finish = rs("aAuctionEnd")
thisItem = rs("bid")
enddate = (DateDiff("n", now, finish))
'get the specific items bid_info
  call openConn2
  sql2 = "SELECT * From auctionBid b1 WHERE b1.aIDItem = " & thisItem & " AND aBidAmount = (SELECT MAX(aBidAmount) FROM auctionBid b2 WHERE b2.aIDItem = " & thisItem & " )"
  call QueryConn2
    if (rs2("b2.aIDUser") = session("logged_ind")) then
    youOwnThis = 1
    end if
    if rs2.eof then
      youOwnThis = 0
      highestoffer = rs("aAmountSelling")
    end if
    highestoffer = rs2("aBidAmount")
  rs2.close
%>

<form method="post" action="auctionBidAdd.asp">
<table border="1" cellpadding="0" width="95%" cellspacing="0">
  <tr><td>
    <table border="0" cellpadding="0" width="100%" cellspacing="0">
      <tr><td colspan="3">Auction ends @ GMT  <%= finish %></td></tr>
    <tr bgcolor="#DFDFDF"><td></td><td>Price</td><td>BID</td></tr>
      <tr>
      <td width="35"><a href="car.asp?id=<%= thisItem %>" target="blank"><img src="images/photomissing.jpg" height="25" alt="" border="1"></a></td>
      <td><%= highestoffer %> €</td>
      <td>
        <!-- loop to get highest bid owner -->
        <% if youOwnThis then %>
        <button type='button'>Yours</button>
        <% else %>
        <input type=hidden name=fItemId value=<%= thisItem %>>
        <input type=hidden name=fAmountSelling value=<%= highestoffer %>>
        <input type=submit name="fAmountIncrease" value=<%= rs("aAmountIncrease")%>>
        <%
        end if
        %>
      </td>
      </tr>
      <tr><td colspan="3"> <!-- just some debug output -->
        <font color="red"><%= "Yours:" & youOwnThis & " IDItem:" & thisItem & " TopBid:" & highestoffer & " " %></font><br />
      </td></tr>
    </table>
   
    </td>
  </tr>
</table>
</form>

<%
rs.movenext
wend
Avatar billede gnoname Praktikant
15. april 2015 - 12:32 #5
Jeg kan ikke lige gennemskue din

if (rs2("b2.aIDUser") = session("logged_ind"))

for du selecter jo slet ikke aIDUser fra b2 (men derimod fra b1)?
Avatar billede Oakster Nybegynder
15. april 2015 - 12:52 #6
En ændring til;

if (rs2("b1.aIDUser") = session("logged_ind"))

Giver mig samme output -jeg ejer stadig de items der indeholder bud fra mig.
Avatar billede gnoname Praktikant
15. april 2015 - 13:30 #7
Jeg havde forestillet mig noget lignende

if (rs2("aIDUser") = session("logged_ind")) then
    youOwnThis = 1
else
    youOwnThis = 0
end if
Avatar billede Oakster Nybegynder
15. april 2015 - 15:12 #8
@gnoname, så virker det

http://prntscr.com/6u0tqc

Rigtigt mange tak for at guide en rusten og halvblind koder...
Nu mangler jeg så kun at få lavet så brugere kan lave max_bud som der så bearbejdes -men det er en helt anden sag ;)

Smid et svar, så får du point!
Avatar billede gnoname Praktikant
15. april 2015 - 15:32 #9
Helt 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
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

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