2014-02-12 105 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都準備好提供的答案,但我有一半的方式,通過這個時候,他張貼了他的答案,這是使用你的代碼,所以這裏是反正。