我的表格如下:
用户:
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
所以最匹配的科目是第一名,第二名最匹配的科目,等等.... 我的查询中是否有任何修改,以便我可以获得这种类型的排序输出。
答案 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)
根据您希望获得结果的方式,您希望按subjects
中subject
(或代码)的数量排序。这可以通过计算,
(逗号)的数量来实现。
计算字符出现次数的方法是在删除字符时将原始长度减去长度。
示例:强>
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/