2014-02-12 83 views
0

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

$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循环来获得所有可能的结果。但我不认为这种查询方式是一种好的做法。这需要很多时间..是否?我不知道..任何人都可以编辑和显示我一个更好的查询方式和输出这些类似的查询。由于

+0

'$ sql2'和'$ sql3'只应该返回一行吗? – MichaelRushton

+0

我可能是一个查询我猜 –

+0

没有'$ sql2'会返回与'$ pid'和'$ sql3'关联的许多行将与'$ barcode'关联的许多行...如果它是一个或一个,或者它是更多 – user3184462

回答

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 – Bryan

+0

我使用准备好的语句。只是为了节省一些时间在这里写入mysql_query ..顺便这个查询将从库存中抽取产品表和名称以及价格的数量?只是我发布的查询会如何工作? – user3184462

+0

返回的每一行都将包含数据库中的库存名称('name'),库存价格('price')和产品数量('数量')。这种关系可以写成:“给我这个用​​户在他们的购物车中的产品的库存名称,价格和产品数量,每一行代表一个分配给用户ID的购物车行,但是会显示价格和数量该产品,而不是产品ID – Sean

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以及哪些类型的连接。

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

+0

谢谢..我将不得不研究更多关于联接的知识。 – user3184462

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都准备好提供的答案,但我有一半的方式,通过这个时候,他张贴了他的答案,这是使用你的代码,所以这里是反正。