4

おそらくLEFT JOINクエリとして、各ユーザーの上位3つの関心を取得しようとしています。

parentアプリの設計方法では、各ユーザーはテーブルの「子」( のない行) に他ならない一連の興味を持っていcategoriesます。

以下は、モック データを使用した簡略化されたテーブル スキーマです ( SQL Fiddle のデモを参照) 。

-- Users table

| ID |  NAME |
--------------
|  1 |  John |
|  2 |  Mary |
|  3 | Chris |


-- Categories table                           -- Interests table

| ID |                 NAME | PARENT |        | ID | USER_ID | CATEGORY_ID |
--------------------------------------        ------------------------------
|  1 |      Web Development | (null) |        |  1 |       1 |           1 |
|  2 |          Mobile Apps | (null) |        |  2 |       1 |           1 |
|  3 | Software Development | (null) |        |  3 |       1 |           1 |
|  4 |    Marketing & Sales | (null) |        |  4 |       2 |           1 |
|  5 |             Web Apps |      1 |        |  5 |       2 |           1 |
|  6 |                  CSS |      1 |        |  6 |       3 |           1 |
|  7 |                  iOS |      2 |        |  7 |       3 |           1 |
|  8 |      Streaming Media |      3 |        |  8 |       3 |           1 |
|  9 |                  SEO |      4 |        
| 10 |                  SEM |      4 |        

特定のユーザーの上位 3 つの関心を取得するために、通常は次のクエリを実行しました。

SELECT `c`.`parent` as `category_id` 
FROM `interests` `i` LEFT JOIN `categories` `c` ON `c`.`id` = `i`.`category_id` 
WHERE `i`.`user_id` = '2' 
GROUP BY `c`.`parent` 
ORDER BY count(`c`.`parent`) DESC LIMIT 3

このクエリは、categoriesid = 2 のユーザーの上位 3 (親) を返します。

ユーザー テーブルにクエリを実行し、上位 3 つのカテゴリを 3 つの異なるフィールド (推奨) またはgroup_concat(..)1 つのフィールドで取得する方法を知りたい

SELECT id, name, top_categories FROM users, (...) WHERE id IN ('1', '2', '3');

これを行うにはどうすればよいですか?ありがとう!

4

2 に答える 2

0

最初に、各ユーザーの上位 3 つのスキルを個別の行に一覧表示する検索クエリを作成します。次に、それをピボットして、各ユーザーの 3 つのスキルを右に引き出します。各スキル列のスキルで Max(isnull(skill,'')) 式を使用する必要があります。

于 2013-03-13T23:06:11.860 に答える
0

MYSQL で各ユーザーの上位 3 レコードを取得するのは非常に大雑把な方法です。

 SELECT u.id, c.name 
 FROM 
     users u, 
     categories c, 
     (SELECT i.id, 
         i.user_id, 
         i.category_id, 
         @running:=if(@previous=i.user_id,@running,0) + 1 as rId,
         @previous:=i.user_id
     FROM 
         (SELECT * FROM intersect ORDER BY user_id) i JOIN 
         (SELECT @running=0, @previous=0 ) r) i
 WHERE 
     u.id = i.USER_ID AND
     i.CATEGORY_ID = c.id AND 
     i.rId <= 3
 group by u.id, c.name ;

それが役に立てば幸い

フィドル

于 2013-03-14T04:07:54.607 に答える