首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >匹配子查询的SQL查询

匹配子查询的SQL查询
EN

Stack Overflow用户
提问于 2018-04-19 12:27:03
回答 5查看 62关注 0票数 0

我正在创建一个像堆栈溢出一样的网站。

当我们在“堆栈溢出”上发布新的问题时,我们会给出一些与我们的问题相关的标签。

我在表q_related_tag_ids中有一个名为q_related_tag_ids(问题相关标记I)的字段。

我使用这个字段存储所有tag_ids,用逗号(,)分隔,这些逗号与发布的问题有关。

表问题>>

代码语言:javascript
复制
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

表应答>>

代码语言:javascript
复制
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标记相关的问题细节。

为此,我创建了一个查询>>

代码语言:javascript
复制
select * from question where (
                  q_related_tag_ids like '8' 
                  or q_related_tag_ids like '%,8,%'
                  or q_related_tag_ids like '%,8')

有人有更好的方法吗?

EN

回答 5

Stack Overflow用户

发布于 2018-04-19 12:38:38

我将创建一个表,使两个表之间的关系。

表问题>>

代码语言:javascript
复制
q_id | q_title
1    | title1
2    | title2
3    | title3
4    | title4
3    | title3
4    | title4

表应答>>

代码语言:javascript
复制
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...

表关系>>

代码语言:javascript
复制
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)

我建议你看看梅里丝法

票数 1
EN

Stack Overflow用户

发布于 2018-04-19 12:40:51

代码语言:javascript
复制
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)) + ',%'
票数 0
EN

Stack Overflow用户

发布于 2018-04-19 12:43:31

我认为你应该用另一张桌子来存储问题标签。

contains id, question_id, tag_id

这样会更快和更容易维护

请核对一下这个例子

代码语言:javascript
复制
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,那么性能就会好得多。这里您正在整数字段中搜索。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49921120

复制
相关文章

相似问题

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