Thread DBIx::Class: ResultSet über eine relativierte Tabelle sorieren (6 answers)
Opened by pktm at 2009-01-14 17:59

pktm
 2009-01-16 13:35
#118081 #118081
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Ja, so in die Richtung sind meine Experimente auch schon gediegen, aber es gibt nicht exakt das aus, was ich suche.

Hier ist mein Ansatz:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
my $rs = $schema->resultset('Thread')->search(undef,
{
join => 'posts',
select => [qw/subject timestamp/],
'+select' => [
{max => 'timestamp'}
],
'+as' => [qw/tmax/],
order_by => 'timestamp DESC',
group_by => 'me.thread_id',
},
);

foreach my $x ( $rs->all() ) {
say $x->get_column('tmax') . " " . $x->subject();
}


Wenn ich die group_by-Klausel weg lasse erhalte ich das Kreuzprodukt aus threads und posts, das will ich nicht. Ich will immer nur eine Liste aller Threads und deren aktuellesten Post.

Das SQL-Statement dazu sieht so aus:
[sql]
SELECT subject, MAX(timestamp) as tmax
FROM threads
LEFT JOIN posts ON posts.thread_id = threads.thread_id
where board_id = 17
group by threads.thread_id
order by tmax DESC
[/sql]

Der Kniff ist, nach MAX(timestamp) sortieren zu können. Wie ich das DBIx::Class mitteile, habe ich noch nicht herausgefunden.

Ich kann zwar die timestamp-Zelle mit selektieren, aber scheinbar kommt dann, trotz Sortierung nach timestamp DESC nicht das richtige Ergebnis.

DBIx::Class produziert bei obigem Code folgendes:
[sql]
SELECT subject, timestamp, MAX( timestamp )
FROM threads me
LEFT JOIN posts posts ON ( posts.thread_id = me.thread_id )
GROUP BY me.thread_id
ORDER BY timestamp DESC
[/sql]

Da wird einfach nach der falschen Zelle sortiert :-s

PS: das $schema->storage->debug(1); ist echt nützlich :)
http://www.intergastro-service.de (mein erstes CMS :) )

View full thread DBIx::Class: ResultSet über eine relativierte Tabelle sorieren