få hver række med højeste bud som output MySQL

Tags:    mysql database sql

Jeg er i gang med at lave et lille online auktions system, og har i det tilfælde tre tabeller, Person, Lot og Bid. Tabellerne er bygget sådan op at Person indeholder person_id, Person_name og person_email. Lot indeholder lot_id og lot_description. Bid indeholder bid_id, bid_value, bid_lot_id og bid_person_id, hvor bid_lot_id og bid_person_id er fremmed nøgler med reference til henholdsvis Person tabellen og Lot tabellen. SQL koden ser således ud
Fold kodeboks ind/udSQL kode 

Mit problem består så i at jeg gerne vil have trukket rækker ud, sådan så jeg får en for hver 'lot', med det højeste 'bid' og denne persons navn.

Et eksempel er f.eks. at Lot med ID 1 (Super Nintendoen), der er højest bydene personen Martin Rohwedder (person id 1) med buddet 500 (som er det nuværende højeste bud).
Lot ID 2 er højest bydene Peter Nielsen (person id 2) med buddet 3500.
Lot ID 3 er højest bydende Tanja Larsen med buddet 255000.

Jeg vil gerne have data ud som følgende
Fold kodeboks ind/udKode 

Altså så den kun viser navnet på den person der har lavet det højeste bud, for hver enkelt lot.

Har prøvet at lege med MAX() funktionen i MySQL, men kan ikke få den til at gøre som jeg vil have. Håber at nogle kan hjælpe mig med at nå mit mål, og får det ønskede output ud.



Indlæg senest redigeret d. 22.03.2012 23:53 af Bruger #4487
4 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 8 karma
Sorter efter stemmer Sorter efter dato
Ja undskyld mig - jeg var vidst lidt for hurtig i går. MAX er ikke speciel brugbar i vores situation. Det behøver slet ikke at være så besværligt :-)

Fold kodeboks ind/udSQL kode 


Forskellen på mit første bud og dette bud er at vi via et nested SELECT tager Bid tabellen sortered efter bid_values værdi faldende og før vi bruger GROUP BY bid_lot_id, og derfor får hver enkelte bid_lot_id den højeste værdi i stedet for bare den første.

Har stadig ikke testet - men du skal nok få den til at virke nu :-)



Du skal først finde alle de højeste bids for hver enkelt bid_lod_it. Hvis grupperer med GROUP BY bid_lod_it og tager MAX(bid_value) samt bid_person_id som output, så får du den første byggesten.

Fold kodeboks ind/udSQL kode 


Men du vil have navnet på personerne med, så vi skal joine Person tabellen på. Lot tabellen er ikke nødvendig, da lot_id allerede findes i bid. Så det endelige bud må være:

Fold kodeboks ind/udSQL kode 


bid_lot_id selekter vi som lot_id med AS statementet, så vi får præcis det output som du ønskede. Koden er skrevet direkte i editoren her, så jeg tager forbehold for syntaxfejl osv - men jeg tror du fanger idéen :-)



Du skal først finde alle de højeste bids for hver enkelt bid_lod_it. Hvis grupperer med GROUP BY bid_lod_it og tager MAX(bid_value) samt bid_person_id som output, så får du den første byggesten.

Fold kodeboks ind/udSQL kode 


Men du vil have navnet på personerne med, så vi skal joine Person tabellen på. Lot tabellen er ikke nødvendig, da lot_id allerede findes i bid. Så det endelige bud må være:

Fold kodeboks ind/udSQL kode 


bid_lot_id selekter vi som lot_id med AS statementet, så vi får præcis det output som du ønskede. Koden er skrevet direkte i editoren her, så jeg tager forbehold for syntaxfejl osv - men jeg tror du fanger idéen :-)
Hej, Løsningen giver mig følgende output
Fold kodeboks ind/udKode 

Hvilket ikke er helt rigtigt, jeg har leget med din løsning, men kan stadig ikke få den til at virke som jeg ønsker det. Hvorfor viser den kun Martin Rohwedder, når han er den eneste der har budt højest på Lot ID nummer 1.



Tak Gustav... Du er bare den bedste :P - Så forstår jeg bedre at jeg ikke kunne få den til at virke som jeg skulle med MAX() :)



t