Selecteer alleen het hoogste bod van een veiling

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Danny Kater

Danny Kater

26/11/2012 19:01:13
Quote Anchor link
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:

Afbeelding

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

Een ideee?
 
PHP hulp

PHP hulp

20/05/2024 23:32:11
 
- Ariën  -
Beheerder

- Ariën -

26/11/2012 19:02:29
Quote Anchor link
SELECT MAX(bod) FROM veilingen GROUP BY veiling
 
Danny Kater

Danny Kater

26/11/2012 21:24:06
Quote Anchor link
Ik gebruik nu deze query

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

maar krijg dan de laagste biedingen ipv de hoogste?
 
John D

John D

26/11/2012 21:30:01
Quote Anchor link
select * is fout in relatie met GROUP BY en helaas maakt MySQL ook fouten met GROUP BY: MySQL geeft geen foutmeldingen bij onjuiste GROUP BY configuratie. Probeer eerst eens:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$sql = "SELECT auction, MAX(bid) FROM wv_biedingen WHERE `username` = '".$session->username."' GROUP BY auction";
De velden uit de GROUP BY clause moeten corresponderen met de geselecteerde velden die niet gesommeerd, gecumuleerd e.d. worden in de select clause. Een goed database engine zal dat ook als fout melden maar MySQL niet.
Gewijzigd op 26/11/2012 21:32:05 door John D
 
Danny Kater

Danny Kater

26/11/2012 21:35:50
Quote Anchor link
John,

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
 
John D

John D

26/11/2012 21:57:24
Quote Anchor link
iets in deze trant:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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
;


Toevoeging op 26/11/2012 22:08:53:

Of iets vereenvoudigd:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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)
Gewijzigd op 26/11/2012 22:03:30 door John D
 
Danny Kater

Danny Kater

26/11/2012 22:48:03
Quote Anchor link
John,

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)
PHP script in nieuw venster Selecteer het PHP script
1
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)
?>
 
John D

John D

26/11/2012 23:31:54
Quote Anchor link
Er moet nog een group by in de subquery en probeer de query eerst eens in phpadmin zonder de username=
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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)
?>
 
Danny Kater

Danny Kater

26/11/2012 23:55:40
Quote Anchor link
John,

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)
PHP script in nieuw venster Selecteer het PHP script
1
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)
?>


Bedankt!
Gewijzigd op 27/11/2012 00:00:03 door Danny Kater
 
Erwin H

Erwin H

27/11/2012 09:05:12
Quote Anchor link
En hier ga je nu zo verschikkelijk nat op een moment dat je het waarschijnlijk niet verwacht...

Test eens, wat gebeurt er als een gebruiker op twee verschillende veilingen hetzelfde bedrag biedt. Welke selecteer je dan?
 
John D

John D

27/11/2012 11:13:57
Quote Anchor link
@Erwin, dat levert dan toch gewoon twee records op in het lijstje (twee verschillende auctions).
Leg eens wat meer uit dan alleen: ga je nu zo verschikkelijk nat??
 
Erwin H

Erwin H

27/11/2012 11:31:05
Quote Anchor link
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.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
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;
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

27/11/2012 11:41:54
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
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



Toevoeging op 27/11/2012 11:43:33:

Had bovenstaande reactie van Erwin nog niet gezien
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.