Selecteer alleen het hoogste bod van een veiling
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?
SELECT MAX(bod) FROM veilingen GROUP BY veiling
$sql = "SELECT *, MAX(bid) FROM wv_biedingen WHERE `username` = '".$session->username."' GROUP BY auction";
maar krijg dan de laagste biedingen ipv de hoogste?
Code (php)
1
$sql = "SELECT auction, MAX(bid) FROM wv_biedingen WHERE `username` = '".$session->username."' GROUP BY auction";
Gewijzigd op 26/11/2012 21:32:05 door John D
Bedankt voor je bericht. Ik heb de query er in gezet zoals jij hem aangaf. Echter nu de vraag, hoe haal ik de andere velden als ID, bid en datetime nu op?
Pas dan kan ik ook echt checken of dit de hoogste biedingen zijn.
Gewijzigd op 26/11/2012 21:36:14 door Danny Kater
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
SELECT a.username, a.auction, a.MAX_BID, b.username, b.veiling, b.datum, b.status
FROM (SELECT username, auction, MAX(bid) AS MAX_BID
FROM wv_biedingen
WHERE username = '".$session->username."'
GROUP BY auction, username") a,
(SELECT username, veiling, datum, status
FROM wv_biedingen
WHERE bid = (SELECT MAX(bid)
FROM biedingen
WHERE username = '".$session->username."') ) b
WHERE a.username=b.username
;
FROM (SELECT username, auction, MAX(bid) AS MAX_BID
FROM wv_biedingen
WHERE username = '".$session->username."'
GROUP BY auction, username") a,
(SELECT username, veiling, datum, status
FROM wv_biedingen
WHERE bid = (SELECT MAX(bid)
FROM biedingen
WHERE username = '".$session->username."') ) b
WHERE a.username=b.username
;
Toevoeging op 26/11/2012 22:08:53:
Of iets vereenvoudigd:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
SELECT a.veiling, a.bod, a.status, a.bid, a.username
FROM wv_biedingen a
WHERE username = '".$session->username."'
AND bid = (SELECT auction, MAX(bid)
FROM biedingen b
WHERE a.auction=b.auction
AND a.username = b.username)
FROM wv_biedingen a
WHERE username = '".$session->username."'
AND bid = (SELECT auction, MAX(bid)
FROM biedingen b
WHERE a.auction=b.auction
AND a.username = b.username)
Gewijzigd op 26/11/2012 22:03:30 door John D
Heel erg bedankt, maar ik krijg dit nog niet werkende. Ik heb de query wat aangepast, maar het resultaat blijft leeg.
Even wat correcte info:
- De tabel heet wv_veilingen
- De rijen die ik wil uitlezen zijn id, auction, username, bid, datetime
Waarbij ik dan wil laten zien de MAX (bid) per auction
Dit is de laatste die ik geprobeerd heb:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?
SELECT a.auction, a.username, a.bid, a.datetime
FROM wv_biedingen a
WHERE username = '".$session->username."'
AND bid = (SELECT username, auction, MAX(bid)
FROM wv_biedingen b
WHERE a.auction=b.auction
AND a.username=b.username)
?>
SELECT a.auction, a.username, a.bid, a.datetime
FROM wv_biedingen a
WHERE username = '".$session->username."'
AND bid = (SELECT username, auction, MAX(bid)
FROM wv_biedingen b
WHERE a.auction=b.auction
AND a.username=b.username)
?>
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?
SELECT a.auction, a.username, a.bid, a.datetime
FROM wv_biedingen a
WHERE bid = (SELECT auction, MAX(bid)
FROM wv_biedingen b
WHERE a.auction=b.auction
AND a.username=b.username
GROUP BY auction)
?>
SELECT a.auction, a.username, a.bid, a.datetime
FROM wv_biedingen a
WHERE bid = (SELECT auction, MAX(bid)
FROM wv_biedingen b
WHERE a.auction=b.auction
AND a.username=b.username
GROUP BY auction)
?>
Ik heb het gevonden. Testen in phpmyadmin was een goed idee!
Ik kreeg deze foutmelding: #1241 - Operand should contain 1 column(s)
De fout betekend dat je een operatie wilt doen die 1 argument nodig heeft, maar dat je er meerdere geeft.
In de 2e SELECT dus de auction eruit en het werkte.
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?
SELECT a.auction, a.username, a.bid, a.datetime
FROM wv_biedingen a
WHERE username = '".$session->username."'
AND bid = (SELECT MAX(bid)
FROM wv_biedingen b
WHERE a.auction=b.auction
AND a.username=b.username
GROUP BY auction)
?>
SELECT a.auction, a.username, a.bid, a.datetime
FROM wv_biedingen a
WHERE username = '".$session->username."'
AND bid = (SELECT MAX(bid)
FROM wv_biedingen b
WHERE a.auction=b.auction
AND a.username=b.username
GROUP BY auction)
?>
Bedankt!
Gewijzigd op 27/11/2012 00:00:03 door Danny Kater
Test eens, wat gebeurt er als een gebruiker op twee verschillende veilingen hetzelfde bedrag biedt. Welke selecteer je dan?
Leg eens wat meer uit dan alleen: ga je nu zo verschikkelijk nat??
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.
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:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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
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
Toevoeging op 27/11/2012 11:43:33:
Had bovenstaande reactie van Erwin nog niet gezien