3

私は次のようなテーブルを持っています:

ユーザー:

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

クエリで最も好きなサブジェクトを返し、次に 2 番目に好きなサブジェクトなどを返すクエリを実行したい...

例えば ​​:

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

したがって、最も一致した主題が1番目、次に2番目に最も一致した主題など....このタイプのソートされた出力を取得できるように、クエリに変更はありますか。

4

3 に答える 3

2

複数の値を 1 つの列に格納しないでください。

ご覧のとおり、これは頭痛の種になるだけです。テーブルを正規化します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

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 が言うように、1 つの列に複数の値を格納するのは悪い考えです。

于 2013-07-31T10:27:34.413 に答える