第一个循环表
user_id | fname | lname 1 | first | emp 2 | second| emp 3 | third | emp
第二个循环表
shift_id | employee_id 1 | 1 2 | 2 3 | 2
if($employees)
{
foreach ($employees as $employee)
{
if($employee['user_id'] == $shift['employee_id'])
{
echo ucwords($employee['fname']. ' ' .$employee['lname']);
}
}
}
我得到了正确的结果,但我认为有更好的方式来写这个。
答案 0 :(得分:3)
您可以在表格中使用联接。左连接意味着用户行必须存在(因为:LEFT),并且移位enty是可选的。
SELECT user.user_id, user.fname, user.lname, shifts.shift_id
FROM yourUserTable AS user
LEFT JOIN yourShiftsTable AS shifts ON(user.user_id = shifts.employee_id)
现在你在初始数组中得到它,好像你将它从表中选为一行,不再需要在PHP中使用技巧来组合信息。如果可以,总是尝试让数据库来管理数据,它可以比PHP更快地实现方式。
请注意,查询可能有点偏差,我只是把它写成了我的头脑。
答案 1 :(得分:1)
我只是根据为此提供的信息测试了一些测试代码"演示代码"。
注意:我已经将mysqli类用于数据库(实例化$ db)并排除了SQL表设置。
你所拥有的东西就是这个......
案例1 - 原始
$db = new mysqli('localhost', 'root', 'test', 'phptutorials_st26');
echo '<h2>Create $employees </h2>';
$query = "SELECT * FROM users";
$result = $db->query($query);
$employees = $result->fetch_all(MYSQL_ASSOC);
var_dump($employees);
echo '<h2>Create $shifts </h2>';
$query = "SELECT * FROM shifts";
$result = $db->query($query);
$shifts = $result->fetch_all(MYSQL_ASSOC);
var_dump($shifts);
echo '<h2>Using foreach on $employees and $shifts</h2>';
if ($employees) {
foreach ($employees as $employee) {
foreach ($shifts as $shift) {
if ($employee['user_id'] == $shift['employee_id']) {
echo ucwords($employee['fname'] . ' ' . $employee['lname']);
echo '<br>';
}
}
}
}
以上结果是
First Emp
Second Emp
Second Emp
案例2 - 使用加入
正如大家已经说过的那样,使用联接是可行的方式......
$sql = "SELECT u.user_id, u.fname, u.lname, s.shift_id
FROM users AS u
JOIN shifts AS s ON(u.user_id = s.employee_id)
";
$result = $db->query($sql);
$employees = $result->fetch_all(MYSQL_ASSOC);
// To see what comes out because we always check things.
var_dump($joined_result);
(不要问我为什么喜欢在表名中使用非常简短的别名!它只是&#34;一件事&#34;。)
然后你的&#34;循环&#34;简单地变成......
echo '<h2>Using foreach on join</h2>';
foreach ($employees as $employee) {
echo ucwords($employee['fname'] . ' ' . $employee['lname']);
echo '<br>';
}
结果是......
First Emp
Second Emp
Second Emp
案例2 - 减少了代码,只需要1次数据库访问。
这对你有帮助吗?
答案 2 :(得分:0)
你也可以这样做。它有点短。
SELECT TABLE1.FNAME, TABLE1.LNAME, TABLE2.EMPLOYEE_ID
FROM TABLE1, TABLE2
WHERE TABLE1.USER_ID = TABLE2.EMPLOYEE_ID;