在这种情况下,构建SQL查询的正确方法是什么:
$data = $db->query("SELECT * FROM users");
foreach ($data as $row) {
$data2 = $db->one("SELECT amount FROM cart WHERE id = " . $row['id']);
echo $row['name'] . '<br>';
echo $data2['amount'] . '<br>';
}
在上面的例子中,如果我有500个用户,那相当于500个数据库调用吗? 或者我应该使用单个查询,如:
$data = $db->query("SELECT *"
. "\n (SELECT SUM(amount) FROM cart WHERE user.id = cart.user_id) as total"
. "\n FROM users";
这两者之间有什么优点或缺点吗?
答案 0 :(得分:0)
就像你说的那样,第一种方法确实会导致500次数据库调用,所以你的第二种方法更好。 但是,更好的查询可能是
SELECT *, SUM(c.amount) FROM users u JOIN cart c ON c.user_id = u.id GROUP BY u.id
答案 1 :(得分:0)
请考虑以下声明:
select
u.name,
sum(a.amount) as total
from users u
inner join cart a on u.id = a.id
group by
u.name
这将一次性为您提供数据。假设你有购物车用户ID的索引(我假设列名为id)并且用户表的主键是id,那么你的数据提取可能非常快。所以优点是速度和单个查询命中数据库。
您问题中前一种方法的缺点是,如果您有1000个用户,则每1000个用户将从购物车表中提取一次。如果您的PHP脚本在与MySQL服务器不同的服务器上运行,则1000个查询文本将通过网络传输,并且将通过网络返回1000个结果集。这样的任务需要更多的时间,并且在数据库方面只增加了一些工作。将此与想要购买的每种产品一次去杂货店进行比较。从家里到商店买鸡蛋,把它们放回家,再去买苹果,把它们放回家......这显然是低效的。为了使这个过程高效,我们从杂货店买了一大堆东西。一枪。这是相同的概念。
当有人更改规范并要求您仅为那些姓氏为Anderson的用户获取金额时,您问题中的第一个方法需要修改select ... from users where last_name = 'Anderson'
,然后逐个获取每个记录的金额。将其与此答案中的单个查询和Kris的答案进行比较,必须将相同的where
子句添加到查询中,并且结果将在一次性查询中获得。