3

我有这样的表:

用户:

uid | course_id | subjects
---------------------------
1   | 1         | html,php
2   | 1         | java,html,sql
3   | 1         | java
4   | 1         | fashion,html,php,sql,java

我想运行一个查询,它可以返回查询中最喜欢的主题,然后是第二多的,依此类推......

例如 :

select * from user where subjects like '%java%' or '%php%' or '%html%';

此查询将返回如下数据:

uid | course_id | subjects
---------------------------
2   | 1         | java,html,sql
3   | 1         | java
4   | 1         | fashion,html,php,sql,java

但我想要这样的输出:

    uid | course_id | subjects
    ---------------------------
    4   | 1         | fashion,html,php,sql,java
    2   | 1         | java,html,sql
    1   | 1         | html,php
    3   | 1         | java

所以最匹配的主题是第一个然后是第二个最匹配的主题等等......我的查询中是否有任何修改,以便我可以获得这种类型的排序输出。

4

3 回答 3

2

永远,永远,永远不要在一列中存储多个值!

就像你现在看到的那样,这只会让你头疼。规范化您的user表格。然后就可以正常选择了。

它应该看起来像这样

uid | course_id | subjects
---------------------------
1   | 1         | html
1   | 1         | php
2   | 1         | java
2   | 1         | html
2   | 1         | sql
3   | 1         | java
...

或者更好地引入一个新表subjects,然后制作一个名为的映射表course_subjects

subject
id | name
------------
1  | html
2  | sql
3  | java
...

course_subjects
uid | course_id | subject_id
---------------------------
1   | 1         | 1
1   | 1         | 2
...
于 2013-07-31T10:24:38.213 回答
1

使用 MyISAM 存储引擎,您可以进行匹配。

最简单的例子:

SELECT *,
       MATCH (subjects) AGAINST ('java php html') AS relevance
FROM `user`
WHERE MATCH (subjects) AGAINST ('java php html')
ORDER BY relevance DESC

在 MySQL 5.6 中,InnoDB 也可以使用全文搜索,但需要一些额外的功能才能使其工作。有关更多信息,请查看以下帖子:http ://www.mysqlperformanceblog.com/2013/03/04/innodb-full-text-search-in-mysql-5-6-part-2-the-queries/

于 2013-07-31T10:31:40.597 回答
1

根据您希望获得结果的方式,您似乎希望subjectssubject. 这可以通过计算,(逗号)的数量来完成。

计算一个字符出现次数的方法是用删除字符时的长度减去原来的长度。

例子:

SELECT * 
FROM   USER 
WHERE  subjects LIKE '%java%' 
        OR '%php%' 
        OR '%html%' 
ORDER  BY ( Length(subjects) - Length(Replace(subjects, ',', '')) ) DESC; 

SQLFiddle:http ://sqlfiddle.com/#!2/cc793/4

结果:

UID COURSE_ID   SUBJECTS
4   1           fashion,html,php,sql,java
2   1           java,html,sql
3   1           java

注意: 正如 juergen 所说,在一列中存储多个值是一个坏主意。

于 2013-07-31T10:27:34.413 回答