我正在创建一个像堆栈溢出一样的网站。
当我们在“堆栈溢出”上发布新的问题时,我们会给出一些与我们的问题相关的标签。
我在表q_related_tag_ids中有一个名为q_related_tag_ids(问题相关标记I)的字段。
我使用这个字段存储所有tag_ids,用逗号(,)分隔,这些逗号与发布的问题有关。
表问题>>
q_id | q_title | q_ralated_tag_ids
1 | title1 | 4,5,8
2 | title2 | 6,8,1
3 | title3 | 2,81,13
4 | title4 | 8
3 | title3 | 2,87
4 | title4 | 83表应答>>
t_id | t_name | t_description
1 | java | java is ...
2 | php | php is ...
3 | ajax | ajax is ...
4 | c++ | c++ is ...
5 | perl | perl is ...
8 | java8 | java8 is...
...现在的问题是>>,我想获取/选择所有与tag-id = 8相关的问题细节,或者与java8标记相关的问题细节。
为此,我创建了一个查询>>
select * from question where (
q_related_tag_ids like '8'
or q_related_tag_ids like '%,8,%'
or q_related_tag_ids like '%,8')有人有更好的方法吗?
发布于 2018-04-19 12:38:38
我将创建一个表,使两个表之间的关系。
表问题>>
q_id | q_title
1 | title1
2 | title2
3 | title3
4 | title4
3 | title3
4 | title4表应答>>
t_id | t_name | t_description
1 | java | java is ...
2 | php | php is ...
3 | ajax | ajax is ...
4 | c++ | c++ is ...
5 | perl | perl is ...
8 | java8 | java8 is...表关系>>
t_id | q_id
4 | 1
5 | 1
8 | 1
6 | 2
8 | 2
1 | 2关系表的主键是使用两个外键之间的连接创建的,并且是唯一的。
SELECT * FROM question WHERE q_id IN (SELECT q_id FROM relation WHERE t_id = 8)
我建议你看看梅里丝法
发布于 2018-04-19 12:40:51
SELECT question.q_title,
tags.t_name
FROM question
INNER JOIN tags ON ',' + question.q_ralated_tag_ids + ',' LIKE '%,' + CAST(tags.t_id AS NVARCHAR(20)) + ',%'发布于 2018-04-19 12:43:31
我认为你应该用另一张桌子来存储问题标签。
表contains id, question_id, tag_id
这样会更快和更容易维护
请核对一下这个例子
id | quesion_id | tag_id
1 | 1 | 4
2 | 1 | 5
3 | 1 | 8
4 | 2 | 6
5 | 2 | 8
8 | 2 | 1我认为现在您正在使用varchar或text来存储标记,搜索数据类型需要花费更多的时间。如果使用另一个表来存储question_tags,那么性能就会好得多。这里您正在整数字段中搜索。
https://stackoverflow.com/questions/49921120
复制相似问题