gpt4 book ai didi

php - 获取与其id对应的名字和姓氏

转载 作者:可可西里 更新时间:2023-11-01 00:18:48 26 4
gpt4 key购买 nike

问题

所以,我不知道如何才能做到这一点,但我想做的是使用他们的 ID 获取领导者和学生的名字和姓氏。在我得到学生和领导的名字和姓氏之后,我需要输出它。

团队表

id | leaderID | studentID
1 | 123 | 123456
2 | 123 | 09
3 | 123 | 7776
4 | 233 | 80
5 | 233 | 997

学生 table

studentID | firstname | lastname | teacherID
----------|-----------|----------|----------
123 | Dave | Jackson | 23
123456 | Jessie | Roberts | 23
09 | Rick | Rustels | 24
7776 | Blake | Jackson | 25
80 | Ashly | Kenson | 23
233 | Lilly | Street | 25
997 | Billy | Street | 24

我目前得到的(第一个id是leader的id)

123
123456
09
7776

233
80
997

我想要什么

Dave Jackson
Jessie Roberts
Rick Rustels
Blake Jackson

Lilly Street
Ashly Kenson
Billy Street

所以基本上我想获得与他们的 ID 相对应的名字和姓氏。

PHP 代码

<?php 

require '../connect.php';

$team_data = $link->prepare("SELECT leaderID, studentID, CONCAT(firstname, ' ', lastname) as firstlast FROM teams, students Order by leaderID, studentID");
$team_data->execute();
$team_data = $team_data->fetchAll();

if(!$team_data) {
header("Location: ../../admin.php?msg=Sorry we could not get the data");
}

$data = [];

foreach ($team['firstlast'] as $team) {
$leader_id = $team['leaderID'];
$student_id = $team['studentID'];
$data[$leader_id][] = $student_id;
}

?>

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Teams</title>
</head>
<body>

<?php foreach ($data as $leader_id => $students): ?>
<ul>
<li><strong><?php echo $leader_id; ?></strong></li>
<?php foreach ($students as $student_id): ?>
<li><?php echo $student_id; ?></li>
<?php endforeach; ?>
</ul>
<?php endforeach; ?>

</body>
</html>

最佳答案

单一查询

(
SELECT 1 AS leader, s.studentID AS leaderID, s.studentID,
s.firstname, s.lastname
FROM teams AS t
JOIN students AS s ON s.studentID = t.leaderID
GROUP BY t.leaderID
) UNION (
SELECT 0 AS leader, t.leaderID, s.studentID, s.firstname, s.lastname
FROM teams AS t
JOIN students AS s ON s.studentID = t.studentID
) ORDER BY 2, 1 DESC;

查询由两个 SELECT 和一个 UNION 组成。第一个仅选择使用 GROUP BY 删除重复项的领导者。第二个子查询选择其余的学生。最后,结果集按照 leader ID 升序排序,按照 leader 标志降序排序。

示例输出

leader leaderID studentID firstname lastname
1 123 123 Dave Jackson
0 123 9 Rick Rustels
0 123 7776 Blake Jackson
0 123 123456 Jessie Roberts
1 233 233 Lilly Street
0 233 80 Ashly Kenson
0 233 997 Billy Street

请注意,您可能需要优化表结构才能在不影响性能的情况下运行此查询。例如,您可能需要为 leaderIDstudentID 列添加索引。

两个查询 + PHP

通常一些简单的查询比单个复杂的查询更快。此外,在某些情况下,排序和分组操作在 PHP 中实现比在 SQL 中实现更快。以下是另一种可能比上述复杂查询运行得更快的方法。制定一些基准,以确定哪个更适合您的情况。

<?php
$result = [];

// Collect only leaders
$q = 'SELECT s.studentID, s.firstname, s.lastname
FROM students AS s, teams AS t
WHERE t.leaderID = s.studentID
GROUP BY 1';
$cursor = Db::query($q);
while ($row = Db::fetchNext($cursor)) {
$result[$row['studentID']][] = $row;
}
$cursor->free();

// Collect the rest
$q = 'SELECT s.studentID, t.leaderID, s.firstname, s.lastname
FROM students AS s, teams AS t
WHERE t.studentID = s.studentID';
$cursor = Db::query($q);
while ($row = Db::fetchNext($cursor)) {
$leader_id = $row['leaderID'];
if (isset($result[$leader_id])) {
$result[$leader_id][] = $row;
}
}
$cursor->free();

第一个 block 只选择领导者,并通过 studentID 键将他们存储到 $result 中。

如果相应的leaderID 存在,第二个 block 收集其余的学生并以类似的方式将它们存储到$result 中。 (您可以通过 IN() 将领导者 ID 传递给 WHERE 子句来跳过此检查。)

由于 $result 最初充满了领导者,因此领导者将存储在第一个位置:

Array
(
[123] => Array
(
[0] => Array
(
[studentID] => 123
[firstname] => Dave
[lastname] => Jackson
)

[1] => Array
(
[studentID] => 123456
[leaderID] => 123
[firstname] => Jessie
[lastname] => Roberts
)
(skipped...)
)

[233] => Array
(
[0] => Array
(
[studentID] => 233
[firstname] => Lilly
[lastname] => Street
)
(skipped...)
)
)

Db::query()Db::fetchNext() 是虚函数。前者对数据库执行SQL查询,返回游标到结果集。后者使用游标获取下一个结果。

关于php - 获取与其id对应的名字和姓氏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43431746/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com