- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用 sequelize.js 构建一个项目,其中包括一个标签表和一个故事表。它们具有多对多的关系,这是我在 Sequelize 中使用 StoryTag 的直通表创建的。到目前为止,这一切都完美无缺,但我想获得最流行标签的列表,例如它们在 StoryTag 表中关联的故事数量,并按使用此标签的故事数量对它们进行排序。
这是我正在尝试做的 MySQL 语法。这在 MySQL Workbench 中完美运行:
SELECT tagName, COUNT(StoryTag.TagId)
FROM Tags
LEFT JOIN StoryTag on Tags.id = StoryTag.TagId
GROUP BY Tags.tagName ORDER BY COUNT(StoryTag.TagId) DESC;
这是在 sequelize.js 中起作用的。这是一个原始查询,并不理想,但由于它不处理任何敏感信息,所以不用担心,只是非常不优雅。
//DIRECT QUERY METHOD (TEST)
app.get("/api/directags", function (req, res) {
db.sequelize.query("select tags.id, tags.TagName, COUNT(stories.id) as num_stories
from tags left join storytag on storytag.TagId = tags.id
left join stories on storytag.StoryId = stories.id
group by tags.id order by num_stories desc;", {
type: db.Sequelize.QueryTypes.SELECT
}).then(function(result) {
res.send(result);
});
});
这输出
[
{
"id": 3,
"TagName": "fiction",
"num_stories": 3
},
{
"id": 5,
"TagName": "Nursery Rhyme",
"num_stories": 2
},
...
{
"id": 4,
"TagName": "nonfiction",
"num_stories": 0
}
]
应该的。
不太有效的是:
//Sequelize count tags
//Known issues: will not order by the count
//Includes a random 'storytag' many-to-many table row for some reason
app.get("/api/sequelizetags", function (req, res) {
db.Tag.findAll({
attributes: ["id","TagName"],
include: [{
model: db.Story,
attributes: [[db.sequelize.fn("COUNT", "stories.id"), "Count_Of_Stories"]],
duplicating: false
}],
group: ["id"]
}).then(function (dbExamples) {
res.send(dbExamples);
});
});
哪些输出:
[
{
"id": 1,
"TagName": "horror",
"Stories": [
{
"Count_Of_Stories": 1,
"StoryTag": {
"createdAt": "2018-11-29T21:09:46.000Z",
"updatedAt": "2018-11-29T21:09:46.000Z",
"StoryId": 1,
"TagId": 1
}
}
]
},
{
"id": 2,
"TagName": "comedy",
"Stories": []
},
{
"id": 3,
"TagName": "fiction",
"Stories": [
{
"Count_Of_Stories": 3,
"StoryTag": {
"createdAt": "2018-11-29T21:10:04.000Z",
"updatedAt": "2018-11-29T21:10:04.000Z",
"StoryId": 1,
"TagId": 3
}
}
]
},
{
"id": 4,
"TagName": "nonfiction",
"Stories": []
},
...
{
"id": 8,
"TagName": "Drama",
"Stories": [
{
"Count_Of_Stories": 1,
"StoryTag": {
"createdAt": "2018-11-30T01:13:56.000Z",
"updatedAt": "2018-11-30T01:13:56.000Z",
"StoryId": 3,
"TagId": 8
}
}
]
},
{
"id": 9,
"TagName": "Tragedy",
"Stories": []
}
]
此文不分先后,埋藏故事数。这似乎是来自数据库的常见且频繁的请求,但我不知道如何使用 sequelize.js 正确执行此操作。
让我失望的资源:
Sequelize where on many-to-many join
Sequelize Many to Many Query Issue
How to query many-to-many relationship data in Sequelize
Select from many-to-many relationship sequelize
sequelize 的官方文档:http://docs.sequelizejs.com/manual/tutorial/
sequelize 的一些不太官方但更易读的文档:https://sequelize.readthedocs.io/en/v3/docs/querying/
最佳答案
以下是最终起作用的方法,以防其他人有此问题。我们还在包含故事中添加了一个位置,但这是可选的。此资源比官方 Sequelize 文档更容易理解:https://sequelize-guides.netlify.com/querying/
我还了解到,在使用 sequelize 时,熟悉 promises 真的很有帮助。
db.Tag.findAll({
group: ["Tag.id"],
includeIgnoreAttributes:false,
include: [{
model: db.Story,
where: {
isPublic: true
}
}],
attributes: [
"id",
"TagName",
[db.sequelize.fn("COUNT", db.sequelize.col("stories.id")), "num_stories"],
],
order: [[db.sequelize.fn("COUNT", db.sequelize.col("stories.id")), "DESC"]]
}).then(function(result){
return result;
});
关于javascript - 计算 Sequelize.js 中联接表之间多对多表中的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53566038/
我有一张维护要求表和相关的每月执行频率 维护 +----------+------+ | maint_id | freq | +----------+------+ | 1 | 6
我目前有这些表: CREATE TABLE #SECURITY_TEMP (ID CHAR(30)) CREATE TABLE #SECURITY_TEMP_PRICE_HISTORY (ID CHA
我有一张维护要求表和相关的每月执行频率 维护 +----------+------+ | maint_id | freq | +----------+------+ | 1 | 6
我有一个如下所示的表格 表tbl_veh VIN Record DateChange 11223344 123A 6/24/2012 11223344
我的应用程序的数据模型 群组有很多用户 用户所属组 用户有很多打卡 冲床属于用户 冲床属于PayPeriod PayPeriod hasMany Punch 找电话 $groups = $this->
使用 Join 或 GroupJoin,是否有任何方法可以为父表和子表中的字段生成聚合值。给定一个 Orders 表和一个 OrderDetails 表,使用下面的 2 个步骤我可以从 Orders
我有一个包含用户 ID 和用户名的用户表。另一个表有一个兴趣列表,包括兴趣和姓名。第三个表是一个连接表,包含 userid 和interestid。 对于每对用户,我想获取他们共同兴趣的数量。我尝试了
假设我有下表: 表A a_name | age | country Jordan | 5 | Germany Molly | 6 | Spain Paris | 7 | France John | 7
数据源是 CSV 文件的集合,因此没有实际的数据库。这是与日本已有数十年历史的遗留系统的集成。 我有一个 c# 函数需要将 2 个 DataTables 和 2 个列名作为参数。我的函数需要对这两个数
我有一种情况要在具有数据的elasticsearch中编写搜索查询,如下所示 {id:"p1",person:{name:"name",age:"12"},relatedTO:{id:"p2"}} {
我想创建具有父子关系的文档。 我有如下数据 parent_id = null的父文档数据 { "id": 1, "work
我有以下按预期工作的 SQL: SELECT p.ACCT_ID AS [Acct], a.ACCT_NAME AS [AcctName], p.PD_NO AS [Period],
我想使用 CriteriaBuilder 在连接 2 个表的位置进行查询。在 MySQL 中,我尝试进行的查询如下所示: SELECT * FROM order LEFT JOIN item ON o
使用带有collection标签的域Service,如下所示: @Entity public class Service extends AbstractEntity { private st
我有一个解决方案,通过连接同一个表两次,但我想知道以下查询是否可以优化? select oc.name as father_occupation, o.name as mother_occupatio
我知道除了知道什么是“最喜欢的编程卡通”之外,stackoverflow 会对我有所帮助:P 这是接受的答案: Bill Karwin 感谢大家的帮助(我想给你们加倍投票) 我的查询结果是这样的(这是
我有两个表格,可以在附图中看到。 表 A 包含部门、月份和平均。 表 B 包含月份、年份、RangeStart、RangeEnd 和 颜色。 如果您查看表 B 的屏幕截图,您将看到每个月都有绿色、黄色
我有一个 Linq to sql 如下: var members=db.Members.Include(x=> x.Contact).Count(); 现在由于一些错误的数据,我的成员中的所有联系人都
我有两个表(用户和帖子),我想写出一个用户的所有帖子(以及其他内容)。我想我应该使用 JOIN 和 WHERE,但我在使用 WHERE 时遇到错误。 这是我的代码: SELECT username,
在 Hibernate 是我的持久性提供者的项目中,我可以使用“join fetch”表达式发出查询,Hibernate 将生成反射(reflect)该内容的 SQL:包含使用有效比较路径的联接表达式
我是一名优秀的程序员,十分优秀!