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