while循环中的SQL查询

时间:2014-02-12 16:16:10

标签: php mysql sql

我在while循环中有一系列的mysql查询..就像这样。

 $sql =  mysql_query("SELECT productid FROM cart WHERE userid='$userid'")
 while($row = mysql_fetch_assoc($sql)){
 $pid = $row['product_id'];

 //Second one

 $sql2 =  mysql_query("SELECT barcode,quantity FROM products WHERE id='$pid'")`
 while($row2 = mysql_fetch_assoc($sql2)){
 $quantity = $row2['quantity'];
 $barcode = $row2['barcode'];

 //Third one

 $sql3 = mysql_query("SELECT name,price FROM inventory WHERE product_barcode=$barcode");
 while($row3 = mysql_fetch_assoc($sql3)){
 $name = $row3['name'];
 $price = $row3['price'];

 echo $name.'<BR />'.$price.'<BR />.$quantity';

   }
 }
}

您可以看到这些查询彼此依赖,因此使用while循环来获取所有可能的结果。但我不认为这种查询方式是一种很好的做法。这需要很多时间..是吗?我不知道..任何人都可以编辑并向我展示一种更好的查询和输出这些类似查询的方法。感谢

3 个答案:

答案 0 :(得分:4)

您可以使用单个查询并将表连接在一起:

SELECT
  inventory.name,
  inventory.price,
  products.quantity
FROM
  cart
INNER JOIN
  products ON cart.product_id = products.id
INNER JOIN
  inventory ON products.barcode = inventory.product_barcode
WHERE
  cart.userid = 1

还值得查看mysqli扩展程序并使用prepared statements

try
{

  $mysqli = new mysqli('hostname', 'username', 'password', 'database');

  if ($mysqli->connect_error)
  {
    throw new Exception($mysqli->connect_error);
  }

  if (!$stmt = $mysqli->prepare("

    SELECT
      inventory.name,
      inventory.price,
      products.quantity
    FROM
      cart
    INNER JOIN
      products ON cart.product_id = products.id
    INNER JOIN
      inventory ON products.barcode = inventory.product_barcode
    WHERE
      cart.userid = ?

  "))
  {
    throw new Exception($mysqli->error);
  }

  if (!$stmt->bind_param('i', $userid))
  {
    throw new Exception($stmt->error);
  }

  if (!$stmt->execute())
  {
    throw new Exception($stmt->error);
  }

  if (!$stmt->bind_result($name, $price, $quantity))
  {
    throw new Exception($stmt->error);
  }

  while ($result = $stmt->fetch())
  {
    echo $name . '<br>' . $price . '<br>' . $quantity;
  }

  if (FALSE === $result)
  {
    throw new Exception($stmt->error);
  }

}

catch (Exception $e)
{
  echo $e->getMessage();
}

答案 1 :(得分:1)

当数据库表之间存在关系时,您可以使用表JOIN来有效地将多个查询压缩为一个。表连接和关系是相当大的主题,因此我不会深入探讨。

前两个问题:

$sql =  mysql_query("SELECT productid FROM cart WHERE userid='$userid'")
$sql2 = mysql_query("SELECT barcode,quantity FROM products WHERE id='$pid'")`

此处两个表之间的关系是您的cart表包含每个用户的产品ID列表(productid)。您的products表包含产品列表(id),每个产品都带有产品ID。

由此可以说,一个产品可能属于许多购物车行。这被称为一对多关系

要说“给我这个用​​户购物车中的产品数量”可以使用以下SQL查询表示:

SELECT 
    p.quantity 
FROM 
    products AS p
RIGHT JOIN 
    cart AS c
ON p.id = c.productid
WHERE c.userid = '$userid'

@MichaelRushton给了你一个非常好的,可行的答案,但你应该更多地研究MySQL Joins以及有什么类型的连接。

他们最终会为您节省大量时间和很多处理能力。

答案 2 :(得分:0)

你应该考虑使用JOIN而不是这样做。

 $sql = "SELECT `c`.`productid`, `p`.`barcode`,`p`.`quantity`,
               `i`.`name`, `i`.`price` 
         FROM `cart` c
         JOIN `products` p ON `p`.`id` = `c`.`product_id`
         JOIN `inventory` i ON `i`.`product_barcode` = `p`.`barcode`
         WHERE userid='$userid'";

$result =  mysql_query($sql);
$row = mysql_fetch_assoc($result);
echo $row['name'].'<br />'.$row['price'].'<br />'.$row['quantity'];

我知道MichaelRushton已经准备好提供了答案,但是当他发布他的答案时,我已经完成了这一步,这是使用你的代码,所以无论如何都是这样。