Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQLite中使用类似分隔符的数组筛选字符串列_Sql_Sqlite_Csv_Database Design_Many To Many - Fatal编程技术网

在SQLite中使用类似分隔符的数组筛选字符串列

在SQLite中使用类似分隔符的数组筛选字符串列,sql,sqlite,csv,database-design,many-to-many,Sql,Sqlite,Csv,Database Design,Many To Many,我必须在我的用户表中添加一列,以按个性化标记进行筛选。其想法是将它们存储在我的sqlite数据库中,以“,”或“;”分隔或者某种分离器 如何根据这些值进行选择筛选 该列的值可能会更改,因此我需要一个方法,可以在其他查询中添加或编辑这些标记 差不多 SELECT * FROM users WHERE tags contain especific tag or tags 或者,有没有更好的做法?(不需要新的索引表) 想法是将它们存储在我的sqlite数据库中,以“,”或“;”分隔或者某种分离器

我必须在我的用户表中添加一列,以按个性化标记进行筛选。其想法是将它们存储在我的sqlite数据库中,以“,”或“;”分隔或者某种分离器

如何根据这些值进行选择筛选

该列的值可能会更改,因此我需要一个方法,可以在其他查询中添加或编辑这些标记

差不多

SELECT * 
FROM users
WHERE tags contain especific tag or tags
或者,有没有更好的做法?(不需要新的索引表)

想法是将它们存储在我的sqlite数据库中,以“,”或“;”分隔或者某种分离器

看来现在还不算太晚,不要伤害自己。。。在进一步阅读之前,请考虑阅读<强> <强>

在关系数据库中表示1-N关系的正确方法是创建一个单独的表,例如
user\u tags
,其结构应如下所示:

user_tags
    id       -- unique identifier (optional)
    user_id  -- reference to users(id)
    tag      -- name of the tag
tags
    id       -- unique identifier
    name     -- tag name

user_tags
    id       -- unique identifier (optional)
    user_id  -- reference to users(id)
    tag_id   -- reference to tags(id)
可能的话,您可以通过创建一个表来存储标签的名称(如果需要,还可以使用其他元信息),并在
user\u tags
表中引用该表的id,该表的结构如下所示:

user_tags
    id       -- unique identifier (optional)
    user_id  -- reference to users(id)
    tag      -- name of the tag
tags
    id       -- unique identifier
    name     -- tag name

user_tags
    id       -- unique identifier (optional)
    user_id  -- reference to users(id)
    tag_id   -- reference to tags(id)
我需要一个能够在其他查询中添加或编辑这些标记的方法

使用逗号分隔的列表,这将是痛苦的。对于一个单独的表,您可以为此使用简单的联接,或者使用
exists
条件来检查多个标记:

-- get all users who own at least one of these tags
select u.*
from users u
where exists (
    select 1
    from user_tags ut
    inner join tags t on ut.tag_id = t.id and t.name in ('foo', 'bar', 'baz')
    where ut.user_id = u.id
)
想法是将它们存储在我的sqlite数据库中,以“,”或“;”分隔或者某种分离器

看来现在还不算太晚,不要伤害自己。。。在进一步阅读之前,请考虑阅读<强> <强>

在关系数据库中表示1-N关系的正确方法是创建一个单独的表,例如
user\u tags
,其结构应如下所示:

user_tags
    id       -- unique identifier (optional)
    user_id  -- reference to users(id)
    tag      -- name of the tag
tags
    id       -- unique identifier
    name     -- tag name

user_tags
    id       -- unique identifier (optional)
    user_id  -- reference to users(id)
    tag_id   -- reference to tags(id)
可能的话,您可以通过创建一个表来存储标签的名称(如果需要,还可以使用其他元信息),并在
user\u tags
表中引用该表的id,该表的结构如下所示:

user_tags
    id       -- unique identifier (optional)
    user_id  -- reference to users(id)
    tag      -- name of the tag
tags
    id       -- unique identifier
    name     -- tag name

user_tags
    id       -- unique identifier (optional)
    user_id  -- reference to users(id)
    tag_id   -- reference to tags(id)
我需要一个能够在其他查询中添加或编辑这些标记的方法

使用逗号分隔的列表,这将是痛苦的。对于一个单独的表,您可以为此使用简单的联接,或者使用
exists
条件来检查多个标记:

-- get all users who own at least one of these tags
select u.*
from users u
where exists (
    select 1
    from user_tags ut
    inner join tags t on ut.tag_id = t.id and t.name in ('foo', 'bar', 'baz')
    where ut.user_id = u.id
)

解决您描述的问题的标准/常规方法是使用一个单独的表将用户ID映射到标记。对于这种方法有很多话要说,但是如果您想将标记保留在users表中,我建议考虑使用JSON1扩展


特别是,给定SQLite支持JSON的各种功能,考虑使用JSON对象来保存所有的标签。每个标签都是一把钥匙。通过这种方式,您可以轻松地添加和删除标记,甚至可以基于标记创建索引。

解决您描述的问题的标准/传统方法是使用一个单独的表将用户ID映射到标记。对于这种方法有很多话要说,但是如果您想将标记保留在users表中,我建议考虑使用JSON1扩展


特别是,给定SQLite支持JSON的各种功能,考虑使用JSON对象来保存所有的标签。每个标签都是一把钥匙。这样,您可以轻松地添加和删除标记,甚至可以基于标记创建索引。

不要这样做。改为使用一个新表,该表逐行存储每个用户的标记。不要这样做。换一个新表,它逐行存储每个用户的标签。好的,谢谢,我也这么认为,关于使用新表,但我的团队lader坚持使用这种方法。我想我可以用这些论点说服他。欢迎@Noark!你会在比尔·卡温(Bill Karwin)的精彩回答中发现更多的论点,我在回答中提到了这些论点,而且是非常好的论点。我也投了他的票。非常感谢再次感谢,我也这么认为,关于使用一张新的桌子,但是我的队员雷德坚持使用这种方法。我想我可以用这些论点说服他。欢迎@Noark!你会在比尔·卡温(Bill Karwin)的精彩回答中发现更多的论点,我在回答中提到了这些论点,而且是非常好的论点。我也投了他的票。非常感谢汉克斯,当我对他的第一个答案发表评论时,我也这么认为,关于使用一个新的表格,但我的团队成员坚持这种方法。我想我可以用这些论点说服他。感谢我对他的第一个答案发表评论,我也这么认为,关于使用新表,但我的团队lader坚持使用这种方法。我想我可以用这些论点说服他。