正确的创建mysql查询的方法

时间:2014-10-26 01:47:22

标签: php mysql

在这种情况下,构建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";

这两者之间有什么优点或缺点吗?

2 个答案:

答案 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子句添加到查询中,并且结果将在一次性查询中获得。