我正在构建一个小型内部电话号码扩展列表。
在数据库中我有两个表,一个是people
表,一个是numbers
表。该关系分别是一对多
。
我想在单个 HTML 表格中显示结果,每行一个人,但如果他们有多个数字,它会在单个列中显示这些结果,并在人员行上使用 rowspan 进行补偿。
现在,要从数据库中获取要使用的结果,我可以:
(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
}
}
}
因此,本质上它做的是完全相同的事情,只是我执行了两个查询以将所有结果放入数组,然后遍历数组以格式化我的表。
我应该使用哪种方法或有更好的方法吗?
最佳答案
常用的方法是进行常规的 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;
既然你甚至问这个问题:我不能强调你应该拿起一本关于数据库设计的介绍性书籍。它帮助我奇迹般地学习了关系数据库背后的理论。
关于php - 我应该在客户端代码中使用多个 SQL 查询还是多个循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12962746/