#sql #laravel #sqlite #eloquent
#sql #laravel #sqlite #красноречивый
Вопрос:
Я создаю веб-приложение, в котором люди голосуют за клиентов. После голосования участников число появится в таблице «Проголосовали за» для каждого конкретного участника. Мне интересно, есть ли способ получить 3 самых распространенных номера (костюмы с наибольшим количеством голосов) из столбца «Проголосовали за», а затем вставить их в другую таблицу. В следующем примере будут сохранены числа 33, 22 и 11, но остальные будут удалены…
user | votedFor
1 | 33
2 | 33
3 | 33
4 | 33
5 | 22
6 | 22
7 | 22
8 | 11
9 | 11
10 | 1
11 | 2
12 | 3
У меня не так много кода для показа — я оглядываюсь, чтобы попытаться разобраться. Нужно ли мне выполнять необработанный SQL-запрос, и я должен просто сосредоточиться на этом, или есть способ сделать это с помощью Eloquent и SQLITE3?
Ответ №1:
В SQLite вы можете использовать агрегацию с order by
и limit
:
select votedFor
from t
group by votedFor
order by count(*) desc
limit 3;
Ответ №2:
Используйте функцию окна aggregation и RANK (), чтобы получить также связи:
select votedFor
from (
select votedFor,
rank() over (order by count(*) desc) rnk
from tablename
group by votedFor
)
where rnk <= 3
order by rnk;
Смотрите демонстрацию.
Результаты:
> | votedFor |
> | -------: |
> | 33 |
> | 22 |
> | 11 |