orderBy чаще всего встречается, но возвращает все строки - PullRequest
0 голосов
/ 26 апреля 2018

То, что я в основном пытаюсь сделать, это заказать мою коллекцию на основе наиболее часто встречающихся item_id в результатах.

Например; У меня есть таблица со следующими данными:

+----+---------+---------+---------+---------+
| id | item_id | column2 | column3 | column4 |
+----+---------+---------+---------+---------+
| 1  | 12      | Hi      | DataHere| MoreData|
| 2  | 12      | Hi      | DataHere| MoreData|
| 3  | 14      | Hi      | DataHere| MoreData|
| 4  | 13      | Hi      | DataHere| MoreData|
| 5  | 12      | Hi      | DataHere| MoreData|
| 6  | 21      | Hi      | DataHere| MoreData|
+----+---------+---------+---------+---------+

То, как я могу получить доступ к исходной таблице, будет с простой MyData::get() моделью и аксессором.

Я попытался сделать следующее, но могу получить только item_id & count для возврата, мне нужно, чтобы все столбцы были возвращены, только что упорядоченные наиболее частыми item_id

MyData::select(\DB::raw('item_id'), \DB::raw('count(*) as count'))->having('item_id', '>', '0')->groupBy('item_id')->orderBy('count', 'desc')->get();

Мой ожидаемый результат будет:

+----+---------+---------+---------+---------+
| id | item_id | column2 | column3 | column4 |
+----+---------+---------+---------+---------+
| 1  | 12      | Hi      | DataHere| MoreData|
| 2  | 12      | Hi      | DataHere| MoreData|
| 5  | 12      | Hi      | DataHere| MoreData|
| 6  | 21      | Hi      | DataHere| MoreData|
| 3  | 14      | Hi      | DataHere| MoreData|
| 4  | 13      | Hi      | DataHere| MoreData|
+----+---------+---------+---------+---------+

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Это должно работать:

$table = app(MyData::class)->getTable();
MyData::selectRaw("*, (select count(*) from $table t where t.item_id = $table.item_id) as count")
    ->orderBy('count', 'DESC')
    ->get();

Вы можете заменить первую строку и $table фактическим именем таблицы. И * с полями, которые вы действительно хотите выбрать.

На самом деле, если вам не нужно count в выборе, вы можете просто сделать:

$table = app(MyData::class)->getTable();
MyData::orderByRaw("(select count(*) from $table t where t.item_id = $table.item_id) DESC")
    ->get();
0 голосов
/ 26 апреля 2018

Вы можете сделать запрос внутри DB.raw, например: DB::select( DB::raw("SELECT p.name, part.* FROM programs p, parts part WHERE p.id = part.id"));

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...