Beste,

Ik haal met deze query

$sql = "SELECT * FROM wv_biedingen WHERE `username` = '".$session->username."' GROUP BY auction, bid DESC";

deze gegevens op uit de DB:



Echter wil ik alleen het hoogste bod van deze gebruiker PER veiling laten zien. Ipv alle biedingen van deze gebruiker.

Een ideee?
Omdat de data die je terug krijgt simpelweg niet is wat je verwacht. Strict genomen weet je helemaal niet meer of de data die je terug krijgt nog wel klopt, zeker niet als je er vanuit gaat maar 1 waarde te krijgen en dus zelfs niet eens meer controleert of je eerste record wel het enige is. Dan kan het dus zijn dat je opeens gegevens toont van zelfs een heel andere veiling!

De vraag is overigens een heel standaard vraag, met een heel standaard oplossing. Als je even zoekt vind je honderden voorbeelden. Waar het op neer komt is dat je een subquery bouwt met de indices van de veilingen en de max waarde. Vervolgens join je die met de oorspronkelijke tabel op zowel veiling index als hoogste waarde. Op die join selecteer je alleen de juiste veiling en je zit direct goed. Alleen als er op die bewuste veiling meerdere biedingen zouden zijn met dezelfde waarde krijg je meerdere rijen terug, alleen is dat onmogelijk, want dan zou de veiling nog doorgaan en heb je dus nog niet het hoogste bod.


SELECT a.auction, a.username, b.bid, a.datetime
FROM wv_biedingen a
LEFT JOIN (
  SELECT auction, MAX(bid) AS bid
  FROM wv_biedingen
  GROUP BY auction
) b ON (a.auction = b.auction AND a.bid = b.bid)
WHERE a.auction = 1;
Dat zal nog wel meevallen, maar dit wordt bij grote aantallen records verschrikkelijk traag vanwege de dependend subquery, en is dus beter om te schrijven naar een join.
En als ik het goed lees wil TS het hoogste bod van een gebruiker op alle veilingen, en daarnaast ook weten of het al dan niet het hoogste bod van een veiling is.
Zo even uit mijn hoofd krijg je dan dit:

SELECT
	auction,
	username,
	datetime,
	u_maxbid,
	IF(u_maxbid=v_maxbid, 'hoogste', 'verloren') status
FROM
	(SELECT
		a.auction,
		a.username,
		a.datetime,
		MAX(a.bid) u_maxbid,
		b.v-maxbid
	FROM
		wv_biedingen a
	INNER JOIN
		(SELECT
			auction,
			MAX(bid) v_maxbid
		FROM
			wv_biedingen
		GROUP BY
			auction) b
	ON
		a.auction = b.auction	
	WHERE
		a.username = 'anuser'
	GROUP BY
		a.auction,
		a.username,
		a.datetime,
		b.v_maxbid
	HAVING
		a.bid = u_maxbid
	) c



[size=xsmall]Toevoeging op 27/11/2012 11:43:33:[/size]

Had bovenstaande reactie van Erwin nog niet gezien

Reageren