簡體   English   中英

按計數關聯順序排列?

[英]Sequelize order by count association?

我有UserPost表。 User has Many Posts關系。 我想查詢用戶並按用戶發布的帖子數量對查詢進行排序。 我如何編寫這個 sequelize 查詢?

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

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

如何讓這個用戶查詢按 Post 排序?

可能有更好的方法,但您可以使用.literal()創建子查詢並分配別名。 然后,您可以在訂購時引用別名,示例:

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

這將產生以下 SQL:

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

sequelize 有這個,但是你需要為計數創建一個別名

User.findAll({
  attributes: {
    include: [
       [sequelize.fn('COUNT', sequelize.col('Post.id')), 'count']
    ]
  },
  include: [{
    attributes: [],
    model:Post,
    duplicating: false,
    required: false
  }],
  group: ['User.id'],
  order: [['count', 'DESC']]
});

把它轉過來讓續集給你

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

也就是說,從 Post 開始,而不是 User。

可能這可以工作

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);
            })

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM