[MySQL] Query met opt. MAX in JOIN/ORDER BY met LIMIT

Pagina: 1
Acties:

  • r0bert
  • Registratie: September 2001
  • Laatst online: 26-01 16:11
Ik kom echt niet verder met mijn mySQL query, heb de search al afgezocht, maar ben niet tot het antwoord gekomen.

De query gebruik ik voor een veilingsite (opdracht voor school). Nu wil ik graag van een veiling, de volgende gegevens ophalen:
- veilinggegevens (uit tblVeilingen)
- de hoogste bieding + info (uit tblVeilingBiedingen) *
- één foto (uit tblVeilingFotos) *
- naam van aanbieder (uit tblUsers)

Probleem vind ik vooral in het vinden van de hoogste bieding met de bijbehorende gegevens.

Nou dacht ik het na veel prutsen een beetje voor elkaar te hebben, maar nu blijkt dat als er geen biedingen zijn, ik ook geen resultaat krijg (snap wel waarom).

query die ik daarvoor gebruikte:
SQL:
1
2
3
4
5
SELECT *, MAX(`B`.`fltBedrag`) `maxBod` FROM `tblVeilingen` `V`, `tblVeilingBiedingen` `B`
    INNER JOIN `tblUsers` `U`       ON `V`.`intAanbiederId`     = `U`.`intId`
    INNER JOIN `tblVeilingFotos` `F`    ON `V`.`intVeilingId`   = `F`.`intVeilingId`
  WHERE `V`.`intVeilingId` = `B`.`intVeilingId`
    GROUP BY `B`.`intVeilingId`'

Zoals je ziet haal ik geen gegevens van de bieding op, wat ik ook graag zou willen. En als er geen bieding gedaan is, is de WHERE clause nooit true en komt er dus geen resultaat.

Ik ben al flink bezig geweest met allerlei join, maar heb lukt gewoon niet .. Weet iemand hoe ik het voor elkaar moet krijgen?

Nog 2 dingen, ik wil dus in een query meerdere veilingen ophalen in een query (bij voorkeur, anders moet ik voor iedere veiling een nieuwe query uitvoeren :/ is voor een veilingoverzicht)

Het gaat dus om de hóógste bieding. Dus niet random één.. en allemaal mag wel hoeft niet.

Code die ik ook geprobeerd heb, maar bij het zoeken van de hóógste bieding tegen de lamp liep:
SQL:
1
2
3
4
5
6
SELECT * FROM `tblVeilingen` `tblV`
    INNER JOIN `tblUsers` `tblU`    ON `tblV`.`intAanbiederId`  = `tblU`.`intId`
    INNER JOIN `tblVeilingBiedingen` `tblB` ON `tblV`.`intVeilingId`        = `tblB`.`intVeilingId`
    INNER JOIN `tblVeilingFotos` `tblF` ON `tblV`.`intVeilingId`        = `tblF`.`intVeilingId`
  ORDER BY `dtmDatumStart` DESC 
      LIMIT 15

Verwijderd

je moet die WHERE vervangen door een LEFT JOIN tussen V en B :)

Die 2e query volg ik niet helemaal....

Zo dus:

SQL:
1
2
3
4
5
6
SELECT *, MAX(``fltBedrag`) `maxBod` FROM tblVeilingen LEFT JOIN tblVeilingBiedingen ON             
    tblVeiligingen.intVeilingId = tblVeilingBiedingen.intVeilingID
    INNER JOIN `tblUsers` `U`         ON `V`.`intAanbiederId`     = `U`.`intId`
    INNER JOIN `tblVeilingFotos` `F`    ON `V`.`intVeilingId`    = `F`.`intVeilingId`
  WHERE `V`.`intVeilingId` = `B`.`intVeilingId`
    GROUP BY `B`.`intVeilingId`'

[ Voor 134% gewijzigd door Verwijderd op 05-01-2006 14:58 ]


  • r0bert
  • Registratie: September 2001
  • Laatst online: 26-01 16:11
Maar nu heb ik nog steeds dat als er geen biedingen zijn, de veiling niet door komt (ook niet als ik de WHERE weg laat).

En is er ook nog een manier om de overige info (id e.d.) bij het bod te krijgen?

//e `V` is `tblVeilingen`
Als in
SQL:
1
2
3
4
5
SELECT *, MAX(`fltBedrag`) `maxBod` FROM `tblVeilingen` `V`
    LEFT JOIN `tblVeilingBiedingen` `B` ON `V`.`intVeilingId`    = `B`.`intVeilingId`
    INNER JOIN `tblUsers`           `U` ON `V`.`intAanbiederId`  = `U`.`intId`
    INNER JOIN `tblVeilingFotos`    `F` ON `V`.`intVeilingId`    = `F`.`intVeilingId`
  GROUP BY `B`.`intVeilingId`

[ Voor 53% gewijzigd door r0bert op 05-01-2006 15:23 ]


Verwijderd

SQL:
1
2
3
4
5
6
SELECT *, MAX(``fltBedrag`) `maxBod` FROM tblVeilingen LEFT JOIN tblVeilingBiedingen ON             
    tblVeiligingen.intVeilingId = tblVeilingBiedingen.intVeilingID
    INNER JOIN `tblUsers` `U`         ON `V`.`intAanbiederId`     = `U`.`intId`
    INNER JOIN `tblVeilingFotos` `F`    ON `V`.`intVeilingId`    = `F`.`intVeilingId`
  WHERE `V`.`intVeilingId` = `B`.`intVeilingId`
    GROUP BY `B`.`intVeilingId`'

Ik zie net dat mijn code nooit kan werken.... Wat is V namelijk? :)

Doe eens zo:

SQL:
1
2
3
4
5
SELECT *, MAX(``fltBedrag`) `maxBod` FROM tblVeilingen LEFT JOIN tblVeilingBiedingen ON             
   tblVeiligingen.intVeilingId = tblVeilingBiedingen.intVeilingID AS main, tblUsers, tblVeilingFotos
   WHERE tblUsers.intId = intAanbiederId AND
       tblVeilingFotos.intVeilingId = main.intVeilingId
   GROUP BY intVeilingId

Extra info? Je haalt nu alles uit de tabellen :)

[ Voor 4% gewijzigd door Verwijderd op 05-01-2006 15:13 ]


  • r0bert
  • Registratie: September 2001
  • Laatst online: 26-01 16:11
Je "AS `main`" pikt mySQL niet..

en stel je nu ook niet verplicht dat er een foto moet zijn?

[ Voor 57% gewijzigd door r0bert op 05-01-2006 15:25 ]


Verwijderd

r0bert schreef op donderdag 05 januari 2006 @ 15:22:
Je "AS `main`" pikt mySQL niet..

en stel je nu ook niet verplicht dat er een foto moet zijn?
ff haakjes er om heen of zow... tis hier geen helpdesk ;)

jeps, zo stel ik verplicht dat er een foto is. dat is toch zo? anders maak je daar ook maar een left join van.

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Wat doet die extra backtick in jullie code? ``fltBedrag` is niks, lijkt me? :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

-NMe- schreef op donderdag 05 januari 2006 @ 15:28:
Wat doet die extra backtick in jullie code? ``fltBedrag` is niks, lijkt me? :P
Ik vermoed dat dat een veld is ergens :)

backtick??? Nooit van gehoord :?

  • r0bert
  • Registratie: September 2001
  • Laatst online: 26-01 16:11
Zo komen we dus weer terug bij het begin eigelijk, want nu is de informatie die ik over het bod heb, niet gelijk aan het hoogste bod wat ik heb. Dat was mijn eigenlijke vertrekpunt van het probleem :$

//e, nee, heb ik in mijn queries (zoals gepost) ook wel verwijderd ;)

//e hij is idd beter dan in het begin. (left join/inner join was restant van een boel gekloot in den beginne ;))

[ Voor 34% gewijzigd door r0bert op 05-01-2006 15:33 ]


Verwijderd

r0bert schreef op donderdag 05 januari 2006 @ 15:30:
Zo komen we dus weer terug bij het begin eigelijk, want nu is de informatie die ik over het bod heb, niet gelijk aan het hoogste bod wat ik heb. Dat was mijn eigenlijke vertrekpunt van het probleem :$

//e, nee, heb ik in mijn queries (zoals gepost) ook wel verwijderd ;)
Wat krijg je wel dan?? Die query is volgens mij goed hoor...

  • r0bert
  • Registratie: September 2001
  • Laatst online: 26-01 16:11
SQL:
1
2
3
4
5
SELECT *, MAX(`fltBedrag`) `maxBod` FROM tblUsers, tblVeilingen
    LEFT JOIN tblVeilingBiedingen ON tblVeilingen.intVeilingId = tblVeilingBiedingen.intVeilingId
    LEFT JOIN `tblVeilingFotos` ON `tblVeilingFotos`.`intVeilingid` = `tblVeilingen`.`intVeilingId`
    WHERE tblUsers.intId = intAanbiederId
  GROUP BY `tblVeilingen`.`intVeilingId`

geeft
XML:
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
36
37
38
39
40
41
42
43
44
45
46
<?xml version="1.0" encoding="UTF-8"?>
<root>
    <record>
      <field name="intId">1</field>
      <!-- hoop user info //-->
      <field name="intVeilingId">1</field>
      <field name="intAanbiederId">1</field>
      <field name="dtmDatumStart">2005-12-30 13:04:10</field>
      <field name="dtmDatumEind">2006-01-06 00:00:00</field>
      <field name="varTitel">Testproduct</field>
      <field name="txtOmschrijving">Hier een blaat verhaaltje</field>
      <field name="enuType">a</field>
      <field name="intBiedingId">1</field>
      <field name="intVeilingId">1</field>
      <field name="intBiederId">1</field>
      <field name="fltBedrag">10</field>
      <field name="enuStatus">a</field>
      <field name="intFotoId">1</field>
      <field name="intVeilingId">1</field>
      <field name="varUrl">ac7456441f3616fdf2cac07533544a20.jpg</field>
      <field name="booLocal">1</field>
      <field name="maxBod">35</field>
    </record>
    <record>
      <field name="intId">1</field>
      <field name="varUser">r0bert</field>
      <!-- User info // -->
      <field name="intVeilingId">2</field>
      <field name="intAanbiederId">1</field>
      <field name="dtmDatumStart">2006-01-03 17:36:16</field>
      <field name="dtmDatumEind">2006-01-18 00:00:00</field>
      <field name="varTitel">gelul</field>
      <field name="txtOmschrijving">blaat melp foo</field>
      <field name="enuType">a</field>
      <intBiedingId/>
      <intVeilingId/>
      <intBiederId/>
      <fltBedrag/>
      <enuStatus/>
      <intFotoId/>
      <intVeilingId/>
      <varUrl/>
      <booLocal/>
      <maxBod/>
    </record>
</root>

om precies te zijn ;)

Lijkt er dus heel erg op, zou alleen nog graag de informatie bij het bod hebben. Dat ik kan weergeven wanneer het bod geplaatst is (dus nieuw bod?) en wie het bod geplaatst heeft (eigen bod?)

[ Voor 65% gewijzigd door r0bert op 05-01-2006 15:37 ]


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Ik vermoed dat je in de "GROUP BY" val van MySQL aan het lopen bent. Je moet bij de meeste DBMS-en in je query waarin een aggregate functie voorkomt (zoals MAX) in je GROUP BY alle velden noemen die je ook selecteert zonder er een aggregate functie op los te laten. Bij mysql hoeft dit niet, maar dan is er dus geen garantie over de inhoud van de betreffende velden.

Zie hiervoor ook P&W FAQ - SQL

[ Voor 16% gewijzigd door bigbeng op 05-01-2006 15:36 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Verwijderd schreef op donderdag 05 januari 2006 @ 15:29:
Ik vermoed dat dat een veld is ergens :)

backtick??? Nooit van gehoord :?
Backtick == ` en daar stond er dus een teveel van. ;) Maar dat zal dan wel een tikfout zijn geweest die steeds overgenomen werd. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • r0bert
  • Registratie: September 2001
  • Laatst online: 26-01 16:11
Met testen niet, dus niet zo'n probleem..

Maar is er ook nog een manier waarmee ik in deze query de informatie van het hoogste bod erbij kan voegen? in de join zelf lukt me iig niet.. En met subqueries geprobeerd, maar dat wou ook niet werken.

Verwijderd

Lees die post van bigbeng even! Ik heb niet zoveel verstand van GROUP BY, maar daar gaat het iig mis... Probeer eens een kleinere query en bouw hem stap voor stap uit. Moeten we nou alles voor je gaan doen?

  • r0bert
  • Registratie: September 2001
  • Laatst online: 26-01 16:11
Nee, wat we hier gedaan hebben heb ik namelijk ook al een keer gedaan. Ik vraag ook niet het voor me te doen, maar of iemand kan helpen.

Verder heb ik de P&W faq - sql doorgelezen en weet nog steeds niet hoe ik moet bereiken wat ik aangegeven heb in mijn startpost en later. Anders zat ik hier niet zo te posten :)

Mijn huidige query:
SQL:
1
2
3
4
5
6
7
SELECT *, MAX(`fltBedrag`) `maxBod` FROM `tblUsers` `U`, `tblVeilingen` `V`
      LEFT JOIN `tblVeilingBiedingen` `B` ON `V`.`intVeilingId` = `B`.`intVeilingId`
      LEFT JOIN `tblVeilingFotos` `F`     ON `F`.`intVeilingid` = `V`.`intVeilingId`
   WHERE `U`.`intId` = `V`.`intAanbiederId`
      GROUP BY `V`.`intVeilingId`
      ORDER BY `V`.`dtmDatumStart`
      LIMIT 15


Heb geprobeerd de Join van biedingen te combineren met een subquery, die het bod met het hoogste bedrag uitkiest en daar het ID van selecteerd en die vergelijkt met het ID van de bieding. Echter is het probleem dan, dat ik de ID van de huidige veiling waar de query in zit, nodig heb.. En die kan ik er dus niet in krijgen..

Ps. Boland, ben je erg dankbaar voor je hulp hoor ;)

[ Voor 68% gewijzigd door r0bert op 05-01-2006 16:18 ]

Pagina: 1