2015-11-24 11 views
8

Ho tabella User e Post. User has Many Posts relazione. Voglio interrogare l'utente e ordinare la query in base al numero di post effettuati dagli utenti. Come posso scrivere questa query sequelize?Sequenza ordine per associazione di conteggio?

Post.belongsTo(User, {foreignKey: 'userId'}); 
User.hasMany(Post, {foreignKey: 'userId'}); 

User.findAll({ 
    order: 'COUNT(Post) DESC', //??? 
    include: [Post] 
}); 

Come ottengo questa query utente ordinata per posta?

risposta

9

C'è probabilmente un modo migliore, ma è possibile utilizzare uno .literal() per creare una sottoquery e assegnare un alias. Quindi, è possibile fare riferimento l'alias al momento dell'ordine, del campione:

User.findAll({ 
    attributes: [ 
     'User.username', 
     [sequelize.literal('(SELECT COUNT(*) FROM Posts WHERE Posts.userId = User.id)'), 'PostCount'] 
    ], 
    order: [[sequelize.literal('PostCount'), 'DESC']] 
}); 

Questo dovrebbe produrre il seguente SQL:

SELECT 
    `User`.`username`, 
    (SELECT COUNT(*) FROM Posts WHERE Posts.userId = User.id) AS `PostCount` 
FROM 
    `Users` AS `User` 
ORDER BY 
    PostCount DESC 
+1

mi piace. Una dimostrazione di come il linguaggio intermedio sia (leggermente) più dettagliato del risultato finale.

1

girare intorno in modo che sequelize ti dà

SELECT u.username, 
     COUNT(*) AS PostCount 
    FROM Users AS u 
    JOIN Posts AS p ON p.userId = u.userId 
    GROUP BY u.userId, u.username 
    ORDER BY PostCount DESC 

Questo è , inizia con Posta, non Utente.

+2

Puoi chiarire il concetto di "girarlo", come dovrebbe apparire il codice JS? – drinchev

+0

Siamo spiacenti, ci sono dozzine di interfacce che generano SQL; Non li tengo tutti d'accordo. Molti non riescono ad esporre SQL abbastanza bene da permetterti di ottenere le ottimizzazioni di cui hai bisogno. –

0

Può essere questo può funzionare

var User = objAllTables.User.User(); 
var Post = objAllTables.Post.Post(); 

User.hasMany(Post, {foreignKey: 'userId'}); 
Post.belongsTo(User, {foreignKey: 'userId'}); 


     User.hasMany(Post, {foreignKey: 'userId'}); 
      Post.belongsTo(User, {foreignKey: 'userId'}); 

      User.findAndCountAll({ 
       attributes: ['User.username'], 
       include: [{ model: Post }] 
      }).then(function (result) { 
       console.log(result.count); 
       console.log(result.rows); 
      }) 
+0

Questo non lo ordinerà per conteggio. – drinchev

Problemi correlati