Mysql
 sql >> база данни >  >> RDS >> Mysql

Топ 'n' резултати за всяка ключова дума

Тъй като не сте дали схемата за results , предполагам, че е това или много подобно (може би допълнителни колони):

create table results (
  id int primary key,
  user int,
    foreign key (user) references <some_other_table>(id),
  keyword varchar(<30>)
);

Стъпка 1: обобщете по keyword/user както във вашата примерна заявка, но за всички ключови думи:

create view user_keyword as (
  select
    keyword,
    user,
    count(*) as magnitude
  from results
  group by keyword, user
);

Стъпка 2: класирайте всеки потребител във всяка група ключови думи (обърнете внимание на използването на подзаявката за класиране на редовете):

create view keyword_user_ranked as (
  select 
    keyword,
    user,
    magnitude,
    (select count(*) 
     from user_keyword 
     where l.keyword = keyword and magnitude >= l.magnitude
    ) as rank
  from
    user_keyword l
);

Стъпка 3: изберете само редовете, където рангът е по-малък от някакво число:

select * 
from keyword_user_ranked 
where rank <= 3;

Пример:

Използвани основни данни:

mysql> select * from results;
+----+------+---------+
| id | user | keyword |
+----+------+---------+
|  1 |    1 | mysql   |
|  2 |    1 | mysql   |
|  3 |    2 | mysql   |
|  4 |    1 | query   |
|  5 |    2 | query   |
|  6 |    2 | query   |
|  7 |    2 | query   |
|  8 |    1 | table   |
|  9 |    2 | table   |
| 10 |    1 | table   |
| 11 |    3 | table   |
| 12 |    3 | mysql   |
| 13 |    3 | query   |
| 14 |    2 | mysql   |
| 15 |    1 | mysql   |
| 16 |    1 | mysql   |
| 17 |    3 | query   |
| 18 |    4 | mysql   |
| 19 |    4 | mysql   |
| 20 |    5 | mysql   |
+----+------+---------+

Групирани по ключова дума и потребител:

mysql> select * from user_keyword order by keyword, magnitude desc;
+---------+------+-----------+
| keyword | user | magnitude |
+---------+------+-----------+
| mysql   |    1 |         4 |
| mysql   |    2 |         2 |
| mysql   |    4 |         2 |
| mysql   |    3 |         1 |
| mysql   |    5 |         1 |
| query   |    2 |         3 |
| query   |    3 |         2 |
| query   |    1 |         1 |
| table   |    1 |         2 |
| table   |    2 |         1 |
| table   |    3 |         1 |
+---------+------+-----------+

Потребители, класирани в рамките на ключови думи:

mysql> select * from keyword_user_ranked order by keyword, rank asc;
+---------+------+-----------+------+
| keyword | user | magnitude | rank |
+---------+------+-----------+------+
| mysql   |    1 |         4 |    1 |
| mysql   |    2 |         2 |    3 |
| mysql   |    4 |         2 |    3 |
| mysql   |    3 |         1 |    5 |
| mysql   |    5 |         1 |    5 |
| query   |    2 |         3 |    1 |
| query   |    3 |         2 |    2 |
| query   |    1 |         1 |    3 |
| table   |    1 |         2 |    1 |
| table   |    3 |         1 |    3 |
| table   |    2 |         1 |    3 |
+---------+------+-----------+------+

Само първите 2 от всяка ключова дума:

mysql> select * from keyword_user_ranked where rank <= 2 order by keyword, rank asc;
+---------+------+-----------+------+
| keyword | user | magnitude | rank |
+---------+------+-----------+------+
| mysql   |    1 |         4 |    1 |
| query   |    2 |         3 |    1 |
| query   |    3 |         2 |    2 |
| table   |    1 |         2 |    1 |
+---------+------+-----------+------+

Имайте предвид, че когато има равенства - вижте потребители 2 и 4 за ключова дума "mysql" в примерите - всички страни в равенството получават "последния" ранг, т.е.

Ефективност:добавянето на индекс към колоните с ключова дума и потребител ще помогне. Имам една таблица, която е заявена по подобен начин с 4000 и 1300 различни стойности за двете колони (в таблица с 600 000 реда). Можете да добавите индекса по следния начин:

alter table results add index keyword_user (keyword, user);

В моя случай времето за заявка спадна от около 6 секунди на около 2 секунди.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Django код или MySQL тригери

  2. alter table add external key е неуспешен

  3. Как да използвате ядрото на AspNet.Identity в My Sql база данни

  4. две думи и празни интервали не работят в MYSQL заявка, използвайки LIKE

  5. mysqli или PDO - какви са плюсовете и минусите?