首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从逗号分隔的Knex.js获取值

从逗号分隔的Knex.js获取值
EN

Stack Overflow用户
提问于 2019-09-04 00:30:45
回答 2查看 391关注 0票数 0

我有两个SQlite3表tasktags

task是我的主表,tags存储标记名

我将逗号分隔的值存储在task中。

现在我想通过使用一个Tag names来获得knex.js

task

代码语言:javascript
复制
id   task   tags
---------------------
1     abc     1,2,3
2     xyz     3,1
3     apple   2  

tags

代码语言:javascript
复制
id   tag   
------------
1     cold
2     hot     
3     normal

现在我要输出如下

产出:

代码语言:javascript
复制
id   task   tags
---------------------
1     abc     cold,hot,normal
2     xyz     normal,cold
3     apple   hot

我知道我必须使用联接,但不确定如何在knex.js中实际使用它。请帮帮我。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-04 01:41:01

问题的一部分是你的数据库没有被正确的标准化。与其有两个表任务和制表符,而且在列‘tag’中包含多个标记in,您应该有三个表;‘Task’、‘tag’和'joining‘table’task _tag‘。他们会存储以下数据..。

任务

代码语言:javascript
复制
id   task 
----------
1     abc 
2     xyz 
3     apple 

标签

代码语言:javascript
复制
id   tag   
------------
1     cold
2     hot     
3     normal

task_tags

代码语言:javascript
复制
task_id tag_id
1         1
1         2
1         3
2         1
2         3
3         2

现在,您可以拥有任意数量的标记(无论是否有任何任务使用它们)和任意多个任务(不管它们是否使用任何标记),并通过task_tags表将任务与其标记关联起来。

然后,要获得想要的结果,可以使用select

代码语言:javascript
复制
SELECT 
   tasks.id,
   tasks.task,
   GROUP_CONCAT(tags.tag) -- this gives you the csv line eg cold,hot,normal
from tasks
left join task_tags
ON tasks.id = task_tags.task_id
left join tags
on tags.id = task_tags.tag_id
GROUP BY task.id, tags.id

关于aggfunc.html关于GROUP_CONCAT的解释,请参阅

票数 1
EN

Stack Overflow用户

发布于 2019-09-04 01:41:45

您的任务表应该重新设计为每一行保存一个标记,而不是单行中的多个标记:

代码语言:javascript
复制
id          task        tag       
----------  ----------  ----------
1           abc         1         
1           abc         2         
1           abc         3         
2           xyz         3
2           xyz         1         
3           apple       2  

那就很简单:

代码语言:javascript
复制
SELECT task.id, task.task, group_concat(tags.tag, ',') AS tags
FROM task
JOIN tags ON task.tag = tags.id
GROUP BY task.id, task.task
ORDER BY task.id;

这给

代码语言:javascript
复制
id          task        tags           
----------  ----------  ---------------
1           abc         cold,hot,normal
2           xyz         normal,cold    
3           apple       hot        

遵循关系数据库规则的设计使生活变得更加简单(上面的内容可以进一步规范化;请参阅另一个答案);虽然有些数据库确实支持数组类型,但sqlite不是其中之一。但是,如果您坚持保留当前的设计,那么就会有一个涉及JSON1扩展并将您的CSV数字列表转换为JSON数组的丑陋的攻击:

代码语言:javascript
复制
SELECT task.id, task.task, group_concat(tags.tag, ',') AS tags
FROM task
JOIN json_each('[' || task.tags || ']') AS j
JOIN tags ON tags.id = j.value
GROUP BY task.id, task.task
ORDER BY task.id;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57780104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档