Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[SQL] 1:n relatie

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi

Ik heb een tabel met gegevens en aan die tabel hangen details gegevens.
Wanneer de details veranderen komt er een record bij in de details tabel om de geschiedenis netjes te bewaren.

Nu wil ik echter een query maken dat alles van de master tabel ophaalt en alleen de laatste details.

Wanneer je gewoon met left join de query maakt en je hebt bv vier details records dan krijg je alles terug, 4 records dus.

Ik wil echter alleen de laatste uit de details tabel.

Via een subquery weet ik dat het mogelijk is alleen moet je dan alle kolommen stuk voor stuk definieren.

Ik had iets als

select *, (select a from details d where d.mid = m.mid order by did desc limit 1) as a, (select b from details d where d.mid = m.mid order by did desc limit 1) as b, etc
from master d

is er ook een mogelijkheid om alles ineens te doen dus niet a b c .. apart te schrijven.

met select * krijg je de melding subquery only returns one column..

Bedankt alvast

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 23:37

TeeDee

CQB 241

Volgens mij moet je eens kijken naar JOIN.
Had je al gedaan.

[ Voor 23% gewijzigd door TeeDee op 18-01-2008 11:59 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


Verwijderd

Topicstarter
heb de join gedaan zoals ik al eerder zie, maar dan krijg je alle records terug.

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 23:37

TeeDee

CQB 241

TOP 1?
Blegh. LIMIT. Het gaat hier om mySQL zie ik?

[ Voor 81% gewijzigd door TeeDee op 18-01-2008 12:00 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


Verwijderd

Topicstarter
top 1 gaat ook niet werken, want wil wel alles uit de master tabel.

als ik top1 doe pakt hij er maar eentje uit de master tabel.

gaat voornamelijk over de records in de details tabel. daar wil ik er maar eentje van hebben, gekoppeld aan de master tabel.

  • Aetos
  • Registratie: November 2001
  • Laatst online: 14-10 18:36
Als je nu een beetje capabele database had dan kon je het volgende doen.

code:
1
2
3
4
5
6
7
select * from
    master m,
    (select mid, max(did) from details group by mid) as midmax (mid, did),
    details d
where 
    m.mid = midmax.mid and
    midmax.did = d.did


je kunt deze expliciete join natuurlijk ook herschrijven naar een join.

Maar dit antwoord is waarschijnlijk nutteloos als je MySQL gebruikt.

  • whoami
  • Registratie: December 2000
  • Laatst online: 09:47
Zowiezo zal je ergens een column hebben waarbij je kunt uitmaken welke de laatste gegevens representeren. (Een datum bv die zegt waarop de gegevens gecreeërd / aangepast werden ).

Dan kan je eens kijken naar MAX en GROUP BY

https://fgheysels.github.io/


Verwijderd

Topicstarter
ik heb met wat hulp de volgende query kunnen maken en deze lijkt naar mijn tevredenheid te werken

code:
1
2
3
4
select p.*, d1.*
from master p
left join details d1 on d1.mid= p.mid
left join details d2 on d2.mid = p.mid and d1.did < d2.did where d2.did is null


iemand bekend hiermee?
Pagina: 1