[SQL] alleen de values van de laatste linked row krijgen

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07 12:07
Ben al een uurtje aan het zoeken om het in 1 query to krijgen maar lukt me niet.

Ik heb een tamelijk complexe query (2 database, 12 self-join, 4 outer joins etc) maar zover geen probleem.

Mijn result set is gewoon een set of rows waarvan 1 een foreign-key is naar een andere table 'choices'.

code:
1
    id, choice_id, name, firstname, old_choice, .... (35 andere velden)


de choice 'table'

code:
1
id, created, user_id, first_choice, second_choice, previous_id.


telkens als een user zijn eerste of tweede keuze verandered komt er een extra row bij in de choice tables (previous_id geeft snel weer welke id (in choice) de vorige keuze was.

het komt er nu op neer om alleen de laatste 'entry' values voor first_choice and second_choice bij te voegen aan de grote results set (de grote query is 1 grote samenvatting van de current status van het systeem)

nu dacht ik dat ik een LEFT OUTER JOIN kon toevoegen met een GROUP BY op choice.id en idd met aggregate kan ik de 'LAST(choice.id)' terug krijgen... maar hoe krijg ik IPV de choice.id de Values van first_choice en second_choice terug... ?

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SELECT 
     id
     LAST(choice.id)
     name
     email
     ? value of first_choice of the last row choice.id ?
     
     ...  
FROM users
     LEFT JOIN ....
     LEFT JOIN ...
     ... (nog een heleboel andere ZONDER group by of iets 'speciaals')

     LEFT JOIN choice ON choice.user_id = id
...
GROUP BY choice.id
....
WHERE....

ORDER BY choice.id ASC


Zover ik kan zien kan ik dit doen om voor elke value die ik nodig heb een sub select te doen (maar dan moet ik dus 2 keer net zelfde query doen / row)...

Iemand een idee - ik denk dat ik me blindstaar op een heel simpel probleem... (hence de tweakers check)

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Groupwise maximum is je zoekword. Eigenlijk ben je al heel ver, je zou ook enkel dat id kunnen selecteren en dan de rest er tegenaan joinen.

Compleet andere aanpak: Ipv naar de vorige entry wijzen, kan je ook naar de volgende entry wijzen, en dan hoef je enkel naar rows met next_id IS NULL te kijken. :P

{signature}


Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Conceptueel wordt het ook simpeler als je ipv previous_id een timestamp erbij zet. Dan kan je gewoon sorteren op timestamp en alleen de top row pakken. (of in dit geval een group by met een max()) (een ID is niet gegarandeerd oplopend, toch?)

[ Voor 23% gewijzigd door Zoijar op 01-11-2009 14:55 ]