Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Najlepsze wyniki „n” dla każdego słowa kluczowego

Ponieważ nie podałeś schematu dla results , założę, że to jest to lub bardzo podobne (może dodatkowe kolumny):

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

Krok 1: agregacja według keyword/user jak w przykładowym zapytaniu, ale dla wszystkich słów kluczowych:

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

Krok 2: uszereguj każdego użytkownika w każdej grupie słów kluczowych (zwróć uwagę na użycie podzapytania do uszeregowania wierszy):

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
);

Krok 3: wybierz tylko te wiersze, w których ranga jest mniejsza niż pewna liczba:

select * 
from keyword_user_ranked 
where rank <= 3;

Przykład:

Wykorzystane dane podstawowe:

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   |
+----+------+---------+

Pogrupowane według słów kluczowych i użytkowników:

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 |
+---------+------+-----------+

Użytkownicy uszeregowani według słów kluczowych:

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 |
+---------+------+-----------+------+

Tylko 2 pierwsze z każdego słowa kluczowego:

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 |
+---------+------+-----------+------+

Zwróć uwagę, że w przypadku remisu – zobacz użytkowników 2 i 4 dla słowa kluczowego „mysql” w przykładach – wszystkie strony w remisie otrzymują „ostatnią” pozycję, tj. jeśli remisuje druga i trzecia pozycja, obie otrzymują rangę 3.

Wydajność:pomoże dodanie indeksu do słów kluczowych i kolumn użytkownika. Mam podobne zapytanie do tabeli z 4000 i 1300 odrębnymi wartościami dla dwóch kolumn (w tabeli 600000 wierszy). Możesz dodać indeks w następujący sposób:

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

W moim przypadku czas zapytania spadł z około 6 sekund do około 2 sekund.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ulepszanie zapytania przy użyciu wielu wewnętrznych sprzężeń do wp_postmeta, tabeli klucz/wartość

  2. Znak Euro nie wyświetla się na stronie

  3. Aktualizacja MySQL zmieniająca wiele kolumn jest nieatomowa?

  4. Jak przywrócić bazę danych MySQL z fizycznych plików

  5. PDO fetchAll grupuj pary klucz-wartość do tablicy asocjacyjnej