可能是问题的标题没有正确定义我真正想问的问题。以下是我的问题的更具体描述
我的数据库中有一个下表User
,其中有一列Category
,其中包含多个值,但以逗号分隔
S.no. Name Category
1 Ankit Ex Soldier, Senior Citizen
2 Ritu Widow, Senior Citizen
3 Akash Ex soldier
我想根据类别
搜索记录例如。如果我搜索
select * from User where Category='Senior Citizen'
然后它必须显示Ankit和Ritu记录。 这该怎么做。 请帮忙
答案 0 :(得分:2)
试试这个:
select * from User where Category like '%Senior Citizen%'
答案 1 :(得分:1)
您需要LIKE运营商: -
select * from User where Category LIKE '%Senior Citizen%'
答案 2 :(得分:0)
select * from User where Category LIKE '%Senior Citizen%'
但是你应该为Category使用一个单独的表。
答案 3 :(得分:0)
就像KissLászló所写,你应该把信息分成两个表。这个专业术语称为“规范化”。最重要的是1NF,2NF和3NF(详细信息请参阅this)。
所以它应该如下所示:
Table Persons
PersonId Name
1 Ankit
2 Ritu
3 Akash
Table Categories
CategoryId Name
1 Ex. Soldier
2 Senior Citizen
3 Widow
Table PersonCategories
PersonId CategoryId
1 1
1 2
2 2
2 3
3 3
你为什么要这样做?
在我看来,最大的原因是表现。我用你当前的方法制作了一些测试表,数据集为20k条目。查询的执行大约需要200毫秒才能返回。使用上面的模式执行以下查询约〜1ms
SELECT
*
FROM
Persons AS p
JOIN
PersonCategories AS pc ON p.PersonId = pc.PersonId
JOIN
Categories AS c on pc.CategoryId = c.CategoryId
WHERE
c.Name = 'Senior Citizen'
为什么这个查询要快得多?
因为我们可以在列上轻松使用indices。在上面的模式中,Persons.PersonId和Categories.CategoryId是其表的 PRIMARY KEY 列。因此,将它们用作 JOIN 操作的列具有最低成本。 PersonCategories表的两列都是 FOREIGN KEYS (确保有效的数据库状态并提高性能)。最后,Categories.Name列也有一个 INDEX 。
这种方法可能不好吗?
在大多数情况下,这是要走的路。不这样做的一个原因是,如果你必须处理大量的INSERTS。此模式中的INSERTS具有更高的成本,因为所有索引都需要在INSERTS之后更新。