webForumDet fria alternativet

Hämta högsta bud (även varor utan bud ska representeras)

Databaser & SQL

5 svar · 471 visningar · startad av - Henke -

Medlem sedan jan. 200229 inlägg
Frågan#1

Hej!

Har ett litet problem i MySQL jag inte riktigt vet hur jag ska lösa.
Har provat fyra fem olika varianter på min Query, men ingenting vill riktigt som jag vill.

Jag bygger en sida åt min farbror som har en auktionsfirma.
Det krävs inloggning för att lägga ett bud.

Tabellerna ser ut såhär:

Namn: auktion_vara

+-----------+---------------+-----------------------+
| varu_id     | varu_namn      | auktion_slut                |
+-----------+---------------+-----------------------+
|         1 | Bok           | 2007-01-24 15:00:00   |
|         2 | Lampa         | 2007-02-05 15:00:00   |
|         3 | Stol          | 2007-01-07 15:00:00   |
+-----------+---------------+-----------------------+

Namn: auktion_bud
+--------+---------+---------+-----------+
| bud_id | user_id | bud     | varu_id   |
+--------+---------+---------+-----------+
|      1 |       1 |   20000 |       1   |
|      2 |       1 |   25000 |       1   |
|      3 |       1 |   30000 |       1   |
+--------+---------+---------+-----------+

Mitt problem kommer när jag vill lista alla varor som finns och med i listan vill jag skriva ut vad högsta budet ligger på.
Att plocka fram alla varor med högsta bud blir inget problem, men nu vill jag ta fram alla varor, oavsett om de har fått bud eller inte. Och om de fått bud så vill jag visa högsta budet.

Jag vill alltså kunna få fram:
Bok 30 000kr
Lampa Inga bud
Stol Inga bud

Jag får inte riktigt till det.

Jag skriver i ASP och har tillgång til MySQL 5

Medlem sedan dec. 200012 464 inlägg
#2
select varu_namn,max(bud)
   from auktion_vara 
  left join auktion_bud
  on auktion_vara.varu_id = auktion_bud.varu_id
 group by varu_namn
Medlem sedan jan. 200229 inlägg
#3

Jag löste det med en Subquery istället:

SELECT varu_namn,(Select Max(auktion_bud.bud) FROM auktion_bud WHERE auktion_bud.varu_id = auktion_vara.varu_id GROUP BY auktion_bud.varu_id LIMIT 1) AS MaxBID FROM auktion_vara

Nu har jag dock nästa problem.
Jag listar alla varor (och deras bud) i en lista. Listan blir väldigt lång, så jag kör paging.
Pagingen har jag byggt så den fungerar i två steg.
Första steget räknar ut hur många poster det finns totalt och räknar ut hur många sidor det blir att visa det på , andra steget hämtar posterna för just den sidan man är på (kör i princip en Limit 0,30).

Men nu kommer mitt problem.
På en sida vill jag lista alla varor som har bud, lista dem efter högsta bud.

Kör jag:

SELECT Count(*) As antal,(Select Max(auktion_bud.bud) FROM auktion_bud WHERE auktion_bud.varu_id = auktion_vara.varu_id GROUP BY auktion_bud.varu_id LIMIT 1) AS MaxBID FROM auktion_vara WHERE NOT IsNull(Maxbid) ORDER BY Maxbid

så får jag felmeddelande.
Vet inte riktigt hur jag ska lösa det.
Kan man inte använda Maxbid (ett alias) att gruppera efter när man kör en subquery?

Medlem sedan dec. 20025 483 inlägg
#4

Du bör följa LarsGs råd. Din lösning är mer komplicerad och mindre effektiv.

Hur lyder felmeddelandet?

Medlem sedan dec. 19996 721 inlägg
#5
SELECT v.varu_id,MAX(b.bud) AS MaxBID FROM auktion_vara v, auktion_bud b
WHERE v.varu_id=b.varu_id GROUP BY v.varu_id ORDER BY MAX(b.bud)

Dvs. egentligen samma som LarsG:s, men med en inner join i stället för en left outer.

Skippa subqueries.

Medlem sedan jan. 200229 inlägg
#6

Hmm, jag tog era råd till mig och har byggt om efter era förslag.
Fungerar ypperligt!

Men jag lyckas fortfarande inte räkna hur många poster som finns totalt.
Följande SQL-fråga:

SELECT *, max(bud) As MaxBid FROM auktion_vara LEFT JOIN auktion_bud ON auktion_vara.varu_id = auktion_bud.varu_id WHERE varu_namn LIKE '%%' AND auktion_slut > '2007-01-04 13:30:52' GROUP BY varu_namn ORDER BY varu_namn

Plockar fram alla resultat från databasen och den biten fungerar perfekt.

Men för att räkna ut hur många poster det finns (som jag sedan dividerar med antalet poster jag vill visa per sida för att få fram "sidantalet") så kör jag:

SELECT Count(*) As Antal, max(bud) As MaxBid FROM auktion_vara LEFT JOIN auktion_bud ON auktion_vara.varu_id = auktion_bud.varu_id WHERE varu_namn LIKE '%%' AND auktion_slut > '2007-01-04 13:30:52' GROUP BY varu_namn ORDER BY varu_namn

Resultatet på den sistnämda frågan ger svaret Antal = 1, men frågan över visar minst 30 poster.
Försöker jag räkna antalet varu_id så får jag givetvis "ambigous" till svar.
Kan jag komma runt det här på något enkelt vis?

262 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
126 ms — deklarationer (db)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)