查询以获得最匹配的喜欢首先在mysql中

时间:2013-07-31 10:22:14

标签: mysql sql database

我的表格如下:

用户:

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

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

3 个答案:

答案 0 :(得分: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
...

答案 1 :(得分: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所说,在一列中存储多个值是个坏主意。

答案 2 :(得分: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/