2 Stimmen

Letzte x Blogeinträge - aber nur einmal pro Benutzer

Ich möchte ein Feld mit den letzten x (sagen wir 5) Blogeinträgen anzeigen. Aber ich möchte vermeiden, dass ein sehr aktiver Benutzer zweimal aufgeführt wird.

Mein Versuch läuft auf Folgendes hinaus:

    $stats['blog'] = $this->User->Blog->find('all', array(
        'order'=>array('Blog.published' => 'DESC'), 
        'conditions' => array('Blog.status' => 1), 
        'contain' => array('User.username'),
        'group' => array('User.id'),
        'limit' => 5,
    ));

Aber natürlich gruppieren sich die Gruppen zu früh, ohne die Möglichkeit, sie vorher zu sortieren. Die daraus resultierende Sql verliert oft die zuletzt veröffentlichten Blogeinträge eines Benutzers zugunsten eines seiner älteren Einträge:

SELECT * 
FROM `comm_blogs` AS `Blog` 
LEFT JOIN `comm_users` AS `User` ON (`Blog`.`user_id` = `User`.`id`) 
WHERE `Blog`.`status` = 1 
GROUP BY `User`.`id` 
ORDER BY `Blog`.`published` DESC LIMIT 5

Daher ist das Ergebnis fast immer falsch, weil die neuen Blogeinträge nie auftauchen, wenn dieser Nutzer in der Vergangenheit bereits über etwas anderes gebloggt hat.

Wie kann ich vor der Gruppierung zunächst nach "published DESC" sortieren? Oder gibt es eine andere bequeme Möglichkeit? Vielen Dank

Die Struktur der Tische:

Benutzer:

- id
- username

Blogs:

- id
- user_id
- published (datetime)
- title
- content
- status

@gerald:

Es scheint, dass MYSQl solche Unterabfragen nicht mag:

Syntaxfehler oder Zugriffsverletzung: 1235 Diese Version von MySQL unterstützt noch nicht 'LIMIT & IN/ALL/ANY/SOME subquery'.

SELECT `User`.`id`, `User`.`username`, `Blog`.`id`, `Blog`.`headline`, `Blog`.`published`, `UserInfo`.`gender`, `UserInfo`.`id` FROM `comm_blogs` AS `Blog` 
LEFT JOIN `comm_users` AS `User` ON (`Blog`.`user_id` = `User`.`id`) 
LEFT JOIN `comm_user_infos` AS `UserInfo` ON (`Blog`.`user_id` = `UserInfo`.`id`) 
WHERE `User`.`active` = '1' AND `Blog`.`status` = 1 AND `Blog`.`id` IN (
    SELECT `LastBlog`.`id`, MAX(`LastBlog`.`published`) as last 
    FROM comm_blogs AS LastBlog WHERE `LastBlog`.`status` = 1 
    GROUP BY `LastBlog`.`user_id` ORDER BY last DESC LIMIT 5
) 
ORDER BY `Blog`.`published` DESC

Wenn ich die Subqery-Grenze weglasse:

 Cardinality violation: 1241 Operand should contain 1 column(s)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X