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)