2015-11-24 14 views
8

私はUserPostテーブルを持っています。 User has Many Postsの関係。私は、ユーザーに質問し、ユーザーが行った投稿の数でクエリを並べ替える必要があります。このsequelizeクエリはどのように書くのですか?数の関連付けを順番に並べ替えますか?

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

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

このユーザークエリを投稿ごとにソートするにはどうすればよいですか?

答えて

9

おそらくもっと良い方法がありますが、.literal()を使用してサブクエリを作成し、エイリアスを割り当てることができます。ご注文時に続いて、エイリアスを参照することができ、サンプル:

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

<悪意に満ちた発言->私はそれを愛するを働かせることができるように。

1

有効にすることsequelizeはあなたに

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 

を与えるので、それが周りにある:

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

これは、次のSQLを生成します、ユーザーではなく投稿で始まります。

+2

JSコードをどのように見えるのか、 '周りを回る 'ことを明確にすることはできますか? – drinchev

+0

申し訳ありませんが、SQLを生成するインターフェイスは数十あります。私はそれらすべてに追いついていない。多くの場合、SQLを十分に公開して、必要な最適化を得ることができません。 –

0

が、これは

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

これはカウントでは発注しません。 – drinchev

関連する問題