逗号分隔具有相同行数的值

O P*_*O P 6 php mysql sql laravel

数据库结构

物品:id, name

用户:id, username

user_items:id, user_id, item_id

我现在有一个count()user_items显示数最多的项目的用户:

john: 13
bill: 9
lily: 9
kent: 9
seth: 8
vick: 8
anna: 7
Run Code Online (Sandbox Code Playgroud)

但我希望以这种方式显示它:

13: john
 9: bill, lily, kent
 8: seth, vick
 7: anna
Run Code Online (Sandbox Code Playgroud)

如何使用laravel的刀片查询系统实现这一目标?

Uue*_*rdo 12

不确定Laravel,但这是纯MySQL版本:

SELECT itemCount, GROUP_CONCAT(username)
FROM
(
   SELECT tblU.user_name, COUNT([DISTINCT] tblUI.item_id) AS itemCount
   FROM users AS tblU 
   INNER JOIN user_items AS tblUI ON tblU.id = tblUI.user_id
   GROUP BY tblU.user_name
) AS uic
GROUP BY itemCount
Run Code Online (Sandbox Code Playgroud)

注意,DISTINCT是可选的,因此是方括号.此外,如果您希望用户没有任何项目,您可以使JOIN成为LEFT JOIN.


Mst*_*san 5

在Controller中得到这样的

$users = DB::table('user_items as ui')
    ->select('count',DB::raw("group_concat(name SEPARATOR ', ') as names"))
    ->from(DB::raw('(select count(*) as count,u.username as name from user_items ui  join users u on u.id=ui.user_id  group by u.id) a'))
    ->groupBy('count')
    ->orderBy('count','desc')
    ->get();

$data['users']=$users;

return View::make('hello',$data);
Run Code Online (Sandbox Code Playgroud)

在视图中使用刀片

@foreach($users as $user)
  <li>{{$user->count.':'. $user->names}}</li>
@endforeach
Run Code Online (Sandbox Code Playgroud)

如果您希望显示没有项目的用户,您的查询可以是

$users = DB::table('users as u')
            ->select('count',DB::raw("group_concat(name SEPARATOR ', ') as names"))
            ->from(DB::raw('(select count(ui.item_id) as count,u.username as name from users u  left join user_items ui on u.id=ui.user_id  group by u.id) a'))
            ->groupBy('count')
            ->orderBy('count','desc')
            ->get();
Run Code Online (Sandbox Code Playgroud)

要显示名称,请先分别添加以下代码 $data['users']=$users;

foreach($users as $user){
            $user->names=explode(', ',$user->names);
    }
Run Code Online (Sandbox Code Playgroud)

在刀片中你可以

<ul>
    @foreach($users as $user)
        <li>
            <span>{{$user->count}}:</span>

            @foreach($user->names as $index=>$name)
                <span><a href="#">{{$name}}</a> @if($index!=count($user->names)-1) ,@endif </span>
            @endforeach
        </li>
    @endforeach
</ul>
Run Code Online (Sandbox Code Playgroud)