匹配子查询的sql查询

sqxo8psd  于 2021-06-25  发布在  Mysql
关注(0)|答案(5)|浏览(347)

我正在创建一个网站像堆栈溢出。
当我们在“堆栈溢出”上发布新问题时,我们会给出一些与我们的问题相关的标签。
我有一个字段名为 q_related_tag_ids 表中的(与问题相关的标记ID) question .
我使用此字段存储所有 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')

有没有更好的方法?

huwehgph

huwehgph1#

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

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) 我建议你看看梅里斯法

cgvd09ve

cgvd09ve2#

避免通俗主义者更好,但这里有一个方法可以让你做你想做的事:

FIND_IN_SET('8', q_related_tag_ids)
xlpyo6sf

xlpyo6sf3#

我想你应该用另一张table来存放问号。
table 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来存储标记,在数据类型上搜索需要更多的时间。如果使用另一个表来存储问号标记,性能会好得多。这里您正在整数域中搜索

ekqde3dh

ekqde3dh4#

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)) + ',%'
olmpazwi

olmpazwi5#

SELECT q.*
FROM questions q 
INNER JOIN answer a ON q.q_ralated_tag_ids = a.id or a.t_description LIKE '%java8%'

相关问题