[MySQL] Laatste record uit gerelateerde tabel

Pagina: 1
Acties:

  • m33p
  • Registratie: September 2002
  • Laatst online: 11:27
Hoi, ik zit met een probleem, en na een half uur prutsen kom ik er nog niet uit.

Ik heb een tabel 'customers'. Hierin staan klanten (customerID, ..., ..., opmerkingen). Nou wil ik meerdere adressen per klant kunnen opslaan. Adressen sla ik op in de tabel 'addresses' (addressID, customerIID, firstname, lastname, ..., ...).

Wat ik probeer: Ik wil een pagian waarop de klanten staan, met alleen het laatst ingevoerde adres van die klant. Dit aan de hand van addressID in de tabel addresses.

Ik gebruik nu de volgende query:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT
    addresses.customerID,
    addresses.firstname,
    addresses.lastname,
    addresses.address,
    addresses.zipcode,
    addresses.city
FROM
    customers,
    addresses
WHERE
    addresses.customerID = customers.customerID
GROUP BY
    addresses.customerID
ORDER BY
    addresses.addressID ASC


Dit kan allemaal wel netter met een join enzo maar dat is even niet het punt hier. Deze query werkt, maar geeft gewoon het eerste ingevoerde adres weer. Weet iemand hoe ik deze zo kan aanpassen dat ik alleen het laatste aders krijg uit de addresses tabel? Het kan vast met sub-query's enzo, maar het liefst zo efficient mogelijk natuurlijk. Ik heb al gekeken naar de DISTINCT en CONCAT functies e.d., maar zelf kom ik er niet uit (ben niet zo'n SQL guru).

Graag jullie hulp en alvast bedankt!

  • Rowdy.nl
  • Registratie: Juni 2003
  • Laatst online: 28-11 14:33

Rowdy.nl

Koekje d'r bij?

DESC gebruiken ipv ASC... :)

ASC -> laag naar hoog
DESC -> hoog naar laag

[ Voor 4% gewijzigd door Rowdy.nl op 25-01-2007 10:59 ]

Rowdy.nl - X++ by day. C# by night. I drink coffee in the morning and beer in the evening.


  • Daspeed
  • Registratie: Maart 2001
  • Laatst online: 14:43
Ik ben ook niet zo'n SQL guru, maar ik denk toch echt dat je moet gaan denken aan een subquery. Waarom ben je daar trouwens zo op tegen? Als je indexen een beetje op orde zijn is het qua performance niet eens zo'n probleem denk ik.

  • mithras
  • Registratie: Maart 2003
  • Niet online
Je probleem lijkt gedeeltelijk op de vraag uit dit topic: [sql] select value bij laatste maand van tabel

Zoals Gonadan al zei (Gonadan in "[sql] select value bij laatste maand van...") kan je zoiets proberen:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT
    customerID,
    firstname,
    lastname,
    address,
    zipcode,
    city
FROM
    addresses
WHERE
    addressID = (
        SELECT MAX(A.addressID) AS addressID 
        FROM  addresses AS A
        LEFT JOIN  customers AS C
        ON C.customerID = A.customerIID
        WHERE C.customerID = 1
        GROUP BY C.customerID)

edit:
Al weet ik niet helemaal of dit sql syntactisch kan :p

[ Voor 4% gewijzigd door mithras op 25-01-2007 11:02 ]


  • m33p
  • Registratie: September 2002
  • Laatst online: 11:27
mithras schreef op donderdag 25 januari 2007 @ 11:01:
Je probleem lijkt gedeeltelijk op de vraag uit dit topic: [sql] select value bij laatste maand van tabel

Zoals Gonadan al zei (Gonadan in "[sql] select value bij laatste maand van...") kan je zoiets proberen:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT
    customerID,
    firstname,
    lastname,
    address,
    zipcode,
    city
FROM
    addresses
WHERE
    addressID = (
        SELECT MAX(A.addressID) AS addressID 
        FROM  addresses AS A
        LEFT JOIN  customers AS C
        ON C.customerID = A.customerIID
        WHERE C.customerID = 1
        GROUP BY C.customerID)

edit:
Al weet ik niet helemaal of dit sql syntactisch kan :p
Ik zag het topic, ik ga het even testen, zal straks mijn post updaten.

Hij werkt máár, ik krijg nu (logischerwijs) maar één customer terug (met het laatste adres), en voor zover mijn SQL kennis rijkt kun je deze query niet zomaar aanpassen voor alle customers right?
Rowdy.nl schreef op donderdag 25 januari 2007 @ 10:59:
DESC gebruiken ipv ASC... :)

ASC -> laag naar hoog
DESC -> hoog naar laag
Bedankt maar werkt niet. Ik moet groupen, en daar gaat het al fout, hij pakt dan het laagste ID somehow, sorten maakt daarna niets meer uit

[ Voor 7% gewijzigd door m33p op 25-01-2007 11:06 ]


  • Daspeed
  • Registratie: Maart 2001
  • Laatst online: 14:43
Hij werkt máár, ik krijg nu (logischerwijs) maar één customer terug (met het laatste adres), en voor zover mijn SQL kennis rijkt kun je deze query niet zomaar aanpassen voor alle customers right?
Jawel, de aanpassing is niet erg groot.

  • m33p
  • Registratie: September 2002
  • Laatst online: 11:27
DrClearbottom schreef op donderdag 25 januari 2007 @ 11:23:
[...]

Jawel, de aanpassing is niet erg groot.
Care to share? Ik zit er mee te prutsen, maar nogmaals, ik ken de basis SQL maar hier raak ik hem een beetje kwijt. Het leek mij logisch om die query om te wisselen, dus ipv de customer bij het adres te halen het adres bij de customer(s) te halen, maar dat wil niet helemaal lukken.

  • mithras
  • Registratie: Maart 2003
  • Niet online
Je wil dus eigenlijk een tabel met _alle_ klanten en hun bijbehorende (laatste) adresssen? Ik dacht namelijk dat je van een specifieke klant iets wilde hebben, vandaar de regel
SQL:
1
WHERE C.customerID = 1


Sloop die eruit en je hebt hem wat algemener :)

/edit: en hem omdraaien kan niet zomaar volgens mij: je wil bij een klant een adres (je vraagt vervolgens alleen de laatste op), je wil niet bij elk adres een klant zoeken, daar de unieke klanten uithalen, en vervolgens het laatste adres zoeken ;)

[ Voor 32% gewijzigd door mithras op 25-01-2007 11:30 ]


  • m33p
  • Registratie: September 2002
  • Laatst online: 11:27
mithras schreef op donderdag 25 januari 2007 @ 11:28:
Je wil dus eigenlijk een tabel met _alle_ klanten en hun bijbehorende (laatste) adresssen? Ik dacht namelijk dat je van een specifieke klant iets wilde hebben, vandaar de regel
SQL:
1
WHERE C.customerID = 1


Sloop die eruit en je hebt hem wat algemener :)
Dat gaat niet werken omdat dat in de subquery is. Meerdere resulten op een query dat om één ID vraagt:
Subquery returns more than 1 row

  • Daspeed
  • Registratie: Maart 2001
  • Laatst online: 14:43
Denk eens in stappen.
Verzin eerst eens een query die voor elke customer alleen het laatste adres ophaalt.
En dan pas ga je die 1 op 1 matchen met je customers.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 14:32

Creepy

Tactical Espionage Splatterer

Maak er een gesynchroniseerde subquery van waar bij je de C.customerID vergelijkt met het customerID vanuit de hoofdquery.
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT 
    customerID, 
    firstname, 
    lastname, 
    address, 
    zipcode, 
    city 
FROM 
    addresses H
WHERE 
    addressID = ( 
        SELECT MAX(A.addressID) AS addressID  
        FROM  addresses AS A 
        LEFT JOIN  customers AS C 
        ON C.customerID = A.customerIID 
        WHERE C.customerID = H.customerId 
        GROUP BY C.customerID)

Zoiets dus..

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 15:07
Met '=' kun je maar één resultaat gebruiken, wat was ook alweer de manier om dat met een SET te doen?

spoiler:
IN gebruiken
:P

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


  • mithras
  • Registratie: Maart 2003
  • Niet online
Jaap-Jan schreef op donderdag 25 januari 2007 @ 11:36:
Met '=' kun je maar één resultaat gebruiken, wat was ook alweer de manier om dat met een SET te doen?

spoiler:
IN gebruiken
:P
offtopic:
Owja, ik ging iets te snel met verkeerde shit wegstrepen |:(

  • m33p
  • Registratie: September 2002
  • Laatst online: 11:27
Super, het werkt ondertussen met de query van Creepy als voorbeeld. Kwestie van een order by toevoegen en het werkt zoals ik wil.

IN kende ik ook nog niet echt, nog even over gelezen en dat gaat ook wel handig uitkomen. Misschien toch maar een keer tijd vrijmaken om me wat verder te verdiepen in SQL aangezien mijn SQL kennis een beetje achter loopt met mijn PHP kennis.

Allemaal bedankt!
Pagina: 1