我正在创建一个像Stack Overflow这样的网站 当我们发布关于“堆栈溢出”的新问题时,我们会给出一些与我们的问题相关的标签。
我在表q_related_tag_ids
中有一个名为question
的字段(与问题相关的标记ID)。
我使用此字段存储与发布的问题相关的所有以逗号(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')
有没有人有更好的方法?
答案 0 :(得分:1)
我会创建一个表来建立两个表之间的关系。
表格问题>>
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
Relation表的主键是使用两个外键之间的连接创建的,并且是唯一的
SELECT * FROM question WHERE q_id IN (SELECT q_id FROM relation WHERE t_id = 8)
我建议你看一下Merise方法
答案 1 :(得分:0)
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)) + ',%'
答案 2 :(得分:0)
我认为你应该使用另一张表存储问题标签。
表格contains id, question_id, tag_id
这将更加快速和可维护
请检查示例
< / p>
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的情况下,会有更好的性能。在这里,您在整数字段中搜索
答案 3 :(得分:0)
SELECT q.*
FROM questions q
INNER JOIN answer a ON q.q_ralated_tag_ids = a.id or a.t_description LIKE '%java8%'
答案 4 :(得分:0)
避免使用commalists更好,但这是一种方法来做你正在尝试的事情:
FIND_IN_SET('8', q_related_tag_ids)