简体   繁体   English

如何使用MySQL和PHP匹配两组数据

[英]How to match two sets of data using MySQL and PHP

I have multiple MySQL tables with numerous rows that need to be returned in a table using PHP. 我有多个MySQL表,需要使用PHP在表中返回许多行。 The issue I am having is how to display the information correctly when one of the tables has numerous matching ID's. 我遇到的问题是当其中一个表有多个匹配ID时,如何正确显示信息。

Take this as an example. 以此为例。 This is a table that would hold a schedule that the user(userID) has booked. 这是一个表,用于保存用户(userID)已预订的计划。

bk_schedule bk_schedule

id  userID  date    block   tos status
113 46  2013-12-31  3        yes    1
114 44  2013-12-26  1        yes    3
115 45  2013-12-31  1        yes    3
116 44  2013-12-31  2        yes    3
117 44  2013-12-31  1        yes    3

While it's saving this data it is also saving data into another table with what the user has selected as their "service" separated into new rows foreach service they selected. 虽然它的保存这些数据它也将数据保存到另一个表什么用户选择作为他们的“服务”分为新行foreach服务,他们选择。

bk_service bk_service

id  userID  bk_id   services
212 46       113    7
213 44       114    62
214 45       115    61
215 44       116    14
216 44       117    1
217 44       117    8
218 44       117    22
219 44       117    15

The bk_id is related to the bk_schedule id to form their relationship. bk_id与bk_schedule id相关,以形成它们的关系。

Now when I have to pull this information into a table using Laravel 4 I am getting all the results combined into each row if I use to different table variables. 现在,当我必须使用Laravel 4将此信息提取到表中时,如果我使用不同的表变量,我将所有结果合并到每一行中。 If I attempt to use that same table set using JOIN's I get the rows fine but they are looping through each service rather than combining (I guess since it's looping every row found counting it as a new row). 如果我尝试使用JOIN's使用相同的表集我得到的行很好但是它们循环遍历每个服务而不是组合(我猜它因为它循环每一行发现将它计为一个新行)。

Kind of like this. 有点像这样。

userID  bk_id   services
44       116    14
44       114    62
44       117    8
44       117    22
44       117    15

Here is the code that reflects that. 这是反映这一点的代码。

    public function showHistory($id) {

   $appointment = DB::table('bk_schedule')
    ->select('bk_schedule.id', 'bk_schedule.date', 'bk_timeslot.block', 'bk_status.status', 'pr_service.service')
    ->where('bk_schedule.userID', $id)      
    ->join('bk_status', 'bk_schedule.status', '=', 'bk_status.id')
    ->join('bk_timeslot', 'bk_schedule.block', '=', 'bk_timeslot.id')
    ->join('bk_service', 'bk_schedule.id', '=','bk_service.bk_id')
    ->join('pr_service', 'pr_service.id', '=', 'bk_service.services')
    ->orderBy('date', 'ASC')            
    ->get();

  // var_dump($appointment); die;

    $today = date('Y-m-d');

    foreach($appointment as $appointments) {

        $date = strtotime($appointments->date);     

        $appointments->date = date('l: F d, Y',$date);              
    }


    $service = DB::table('bk_service')
        ->select('pr_service.service', 'pr_service.price')
        ->join('pr_service', 'pr_service.id', '=', 'bk_service.services')
        ->where('bk_service.userID', $id)
        ->where('bk_service.bk_id', $appointments->id)
        ->get();

   return View::make('appointments.history', array('pageTitle' => 'Apppointment History',
                                'today' => $today, 'service' => $service,
                                'appointment' => $appointment)); 
}

Blade template: 刀片模板:

        <table class="main-table">
            <thead class="main-table-head">
                <th>Status/Result</th>
                <th>Date</th>
                <th>Block</th>
                <th>Services</th>
                <th>Action</th>
            </thead>
            <tbody class="main-table-head">
            @foreach($appointment as $appointments)
                <tr>
                    <td>{{{ $appointments->status }}}</td>
                    <td>{{{ $appointments->date }}}</td>
                    <td>{{{ $appointments->block }}}</td>
                    <td>
                        @foreach($service as $services)
                        {{{ $services->service }}}
                        @endforeach
                    </td>
                </tr>
            @endforeach
            </tbody>
        </table>

This is essentially what I want it to look like. 这基本上就是我想要的样子。 (it's an appointment history page if that helps) (这是一个约会历史页面,如果这有帮助)

userID  bk_id   services
44       117    1, 8, 22, 15
44       116    14
44       114    62

i tried to be detailed as possible it's been a pain trying to get this to work. 我试图尽可能详细,试图让它发挥作用是一种痛苦。 I have attempted GROUP_CONCAT but I get the same problem (it's combing all the records for that userID) 我尝试过GROUP_CONCAT但我遇到了同样的问题(它正在梳理该userID的所有记录)

My attempt 我的尝试

        $schedule = DB::table('bk_schedule')
            ->select( DB::raw('users_information.street_2, users_information.phone_2, users_information.apartment, bk_schedule.note, bk_schedule.date, bk_schedule.office, bk_status.status, bk_schedule.id, bk_schedule.userID, bk_timeslot.block, users_information.last_name, users_information.street_1, users_information.phone_1, users_information.user_zip_code, group_concat(pr_service.short_name SEPARATOR " | ") as group_service, group_concat(pr_service.service SEPARATOR ", ") as service_detail'))
            ->join('users_information', 'bk_schedule.userID', '=', 'users_information.id')
            ->join('bk_timeslot', 'bk_schedule.block', '=', 'bk_timeslot.id')
            ->join('bk_service', 'bk_schedule.userID', '=', 'bk_service.userID')
            ->join('pr_service', 'bk_service.services', '=', 'pr_service.id')
            ->join('bk_status', 'bk_schedule.status', '=', 'bk_status.id')
            ->orderBy('bk_schedule.date', 'asc')
            ->groupBy('bk_schedule.id')
            ->paginate(15);

If anyone was curious as to my final solution. 如果有人对我的最终解决方案感到好奇。

        $schedule = DB::table('bk_schedule')
            ->select( DB::raw('bk_schedule.office, pr_service.short_name, bk_timeslot.block, bk_schedule.date, bk_status.status, users_information.last_name, users_information.street_1, users_information.phone_1, users_information.user_zip_code, users_information.street_2, users_information.phone_2, users_information.apartment, bk_schedule.userID, bk_service.id, group_concat(pr_service.service)as service_detail, group_concat(pr_service.short_name)as group_service '))
            ->join('bk_service', 'bk_schedule.id', '=', 'bk_service.bk_id')
            ->join('users_information', 'bk_schedule.userID', '=', 'users_information.id')
            ->join('bk_status', 'bk_schedule.status', '=', 'bk_status.id')
            ->join('bk_timeslot', 'bk_schedule.block', '=', 'bk_timeslot.id')
            ->join('pr_service', 'bk_service.services', '=', 'pr_service.id')
            ->groupBy('bk_service.userID', 'bk_service.bk_id')
            ->paginate(15);

You need to group by both userId and booking id. 您需要按userId和预订ID进行分组。

select sc.userId, sc.id, group_concat(services)
  from bk_schedule sc
  join bk_service se on (sc.id = se.bk_id)
 group by sc.userId, sc.id;

See it on sqlfiddle sqlfiddle上看到它

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM