用于匹配子查询的SQL查询

时间:2018-04-19 12:27:03

标签: mysql sql mariadb

我正在创建一个像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')

有没有人有更好的方法?

5 个答案:

答案 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)