1

我正在建立一个小型内部电话号码分机列表。

在数据库中我有两个表,一个people表,一个numbers表。关系是one-to-many分别的。

我想在单个 HTML 表格中显示结果,每行一个人,但如果他们有多个数字,它会在单个列中显示这些数字,并在个人行上显示行跨度以进行补偿。

现在,要从数据库中获取要使用的结果,我可以这样做:

(pseudocode)

SELECT id, name
FROM people

foreach result as row {
  SELECT number
  FROM numbers
  WHERE numbers.person_id = row['id']
}

这意味着我正在执行一个查询来获取所有用户,但是如果我有 100 个用户,我将执行 100 个额外的查询来获取每个用户的数字。

相反,我可以这样做:

(pseudocode)

SELECT number, person_id
FROM numbers

SELECT id, name
FROM people

foreach people as person {
  echo name
  foreach numbers as number {
    if (number.id = person.id) {
      echo number
    }
  }
}

因此,基本上它在做完全相同的事情,只是我做了两个查询以将所有结果放入数组中,然后循环遍历数组以格式化我的表。

我应该使用哪种方法或者有更好的方法来做到这一点?

4

5 回答 5

4

常见的方法是做一个常规的 JOIN:

SELECT id, name, number
FROM people, numbers
WHERE people.id = numbers.person_id;

您可以添加一个ORDER BY以按顺序获取数字,或者您可以创建一个数组,对结果集进行一次遍历,然后循环遍历该数组。

您还可以考虑使用GROUP_CONCAT来连接同一个人的所有数字:

SELECT id, name, GROUP_CONCAT(number SEPARATOR ', ')
FROM people, numbers
WHERE people.id = numbers.person_id
GROUP BY people.id;

既然您甚至在问这个问题:我不能强调您应该拿起一本关于数据库设计的介绍性书籍。它帮助我了解了关系数据库背后的理论。

于 2012-10-18T20:04:53.463 回答
4

可能只想执行一个查询。就像是

select people.id, people.name, group_concat(numbers.number)
from people 
inner join numbers on numbers.id = people.id
group by people.id, people.name
order by people.name

然后,您可以使用简单的 php 代码遍历结果集。

于 2012-10-18T20:05:51.590 回答
1

这取决于,您可能需要花时间才能找到答案。如果您的数据库与您的 Web 服务器位于不同的计算机上,那么执行多个查询会导致很多网络转弯,因此这通常需要更长的时间。但是,如果您的数据库服务器与 Web 服务器位于同一台计算机上,则这可能不是问题。

还要考虑在数组中查找数字所需的时间。作为一个数组,您正在执行线性顺序 O(N) 搜索。如果你可以把它放在一个散列中,查找会快得多,并且两次查询的方法可能会更快,但如果你花很多时间在你的数组中查找答案,那就不行了。

使用连接将其放入一个查询中可能是最快的,因为数字将与人员相关联,具体取决于您将数据存储到其中以在 foreach 循环中访问的容器结构。

于 2012-10-18T20:10:05.900 回答
0

使用存储过程或函数来检索数据,不要在程序中使用 sql

于 2012-10-18T20:05:20.463 回答
0

你都不应该这样做。您可以对表执行一个查询(连接):

select name, number
from people p, numbers n
where p.id = n.person_id
order by name, number;

然后只有一个循环:

$link = mysqli_connect(...);
$query = 'select name, number from people p, numbers n where p.id = n.person_id order by name, number';

if ($result = mysqli_query($link, $query)) {
    $person = '';
    while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
        if ($row['name'] !== $person) {
            $person = $row['name'];
            echo $person;
        }

        echo $row['number'];
    }
}
于 2012-10-18T20:06:25.710 回答