Avatar billede minau Nybegynder
14. november 2006 - 19:28 Der er 10 kommentarer og
1 løsning

Største i tabellen der passer til ID

Hej

Jeg har to tabeller.
en med medlemmer (members) og en med betalinger (payments)

members består af ID og andre informationer såsom navn og adresse. Det er ikke så vigtigt.

payments består af kolonnerne memberID, amount og date

Jeg prøver at lave en SQL der trækker members tabellens data ud samt den SENESTE betaling de har udført. indtilnu har jeg fundet frem til

SELECT
members.ID, members.forename, payments.amount, payments.date
FROM
members, payments
WHERE
payments.memberID = members.ID


Men den giver mig hver person for hver gang han har betalt overhoved (naturligvis). Jeg prøvede derfor det mest naturlige jeg kunne finde på:


SELECT
members.ID, members.forename, payments.amount, payments.date
FROM
members, payments
WHERE
payments.memberID = members.ID
AND
payments.date = MAX(payments.date)


men det giver kun fejlen
#1111 - Invalid use of group function

hvad skal jeg gøre?
Avatar billede minau Nybegynder
14. november 2006 - 19:41 #1
(i må lige skrive hvsi det er sort snak)
Avatar billede michael_stim Ekspert
14. november 2006 - 19:45 #2
Du skal have en GROUP BY + det du vil gruppere (members.ID, payment.date), til sidst.
Avatar billede minau Nybegynder
14. november 2006 - 19:53 #3
Hmmm. Ja, det giver nok meget god mening at sige hvad den skal groperer dem efter for at den akn vide hvad det er MAX() af

men ak. Endnu en genstridig fejl.

SQL-forespørgsel:

SELECT members.ID, members.forename, payments.amount, payments.date
FROM members, payments
WHERE payments.memberID = members.ID
AND payments.date = MAX( payments.date )
GROUP BY payments.memberID
LIMIT 0 , 30

MySQL returnerede:
#1111 - Invalid use of group function

hvad er der galt?
Avatar billede michael_stim Ekspert
14. november 2006 - 20:04 #4
SELECT members.ID, members.forename, payments.amount, payments.date, payments.memberID
FROM members, payments
WHERE payments.memberID = members.ID
AND payments.date = MAX( payments.date )
GROUP BY payments.memberID
LIMIT 0 , 30
Avatar billede minau Nybegynder
14. november 2006 - 20:10 #5
hmm. Du selecter også payments.memberID

men æv...

SQL-forespørgsel:
SELECT members.ID, members.forename, payments.amount, payments.date, payments.memberID
FROM members, payments
WHERE payments.memberID = members.ID
AND payments.date = MAX( payments.date )
GROUP BY payments.memberID
LIMIT 0 , 30

MySQL returnerede:
#1111 - Invalid use of group function

stadig same fejl...
Avatar billede michael_stim Ekspert
14. november 2006 - 20:21 #6
SELECT members.ID, members.forename, payments.amount, payments.date, MAX( payments.date )
FROM members, payments
WHERE payments.memberID = members.ID
GROUP BY payments.memberID
LIMIT 0 , 30

Tror denne er bedre
Avatar billede minau Nybegynder
14. november 2006 - 20:58 #7
Nej. Ik helt.

resultatet
ID|forename|amount|date|MAX( payments.date)
101|Jerzy|38|2006-01-20|2006-11-15

her har jeg ganske vist fået hver person én gang. Men den viser amoun og date på den FØRSTE betaling (pga ID)- og så dato på sidste betaling.

en jeg får en ide. jeg vil prøve at bruge noget group by DESC med noget destinct :)
Avatar billede minau Nybegynder
14. november 2006 - 21:03 #8
huh...

hvis man skriver

SELECT members.ID, members.forename, payments.amount, payments.date
FROM members, payments
WHERE payments.memberID = members.ID
GROUP BY payments.date

så får man alle betalinger. men skriver man

DESC

til sidst så får man kun én record per person med den med senest dato (altså dét jeg ville)

JEg forstår bare ikke hvorfor DESC skulle udelukke de gamle records. Jeg prøver lige at se om det er anderledes på en mysql 4
Avatar billede minau Nybegynder
14. november 2006 - 21:10 #9
Det virker både i Mysql4 og 5. Så må det jo være svaret
Avatar billede kjulius Novice
15. november 2006 - 09:11 #10
Det lyder altså mærkeligt, hvis du kan få det til at virke med den accepterede SQL. Jeg ville have troet, at du skulle have noget lign. dette:

SELECT members.ID, members.forename, payments.amount, payments.date
FROM members, payments
WHERE payments.memberID = members.ID
  AND payments.date = (SELECT MAX(p.date) FROM payments p WHERE p.memberID = members.ID)
Avatar billede minau Nybegynder
15. november 2006 - 12:42 #11
DET er være den rigtige løsning!!! lige så jeg kan forstå den og stabil overfor "group by" (min virkede nemlig ik hvis man grupperede dem efter fx GROUP BY payments.date DESC, members.ID)

Hvor er jeg dog primitiv at jeg ikke kunne se det med det samme...


kjulius, hop lige in på http://www.eksperten.dk/spm/744952 og smid et svar...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester