[英]How do I display all records from a SQL table and match those records to another table?
我將PHP變量$ accountnumber設置為正在查看其個人資料頁面的用戶的變量。 在頁面上,我有一個塊,其中包含從數據庫中填充的用戶信息,並且我擁有我們擁有的所有產品的列表,並且我想通過為客戶分配一個類來在客戶擁有的每個產品旁邊打一個勾號。它。
這是我的桌子:
products
id | name | url | weight
100 p1 p1.html 1
101 p2 p2.html 2
102 p3 p3.html 3
103 p4 p4.html 4
104 p5 p5.html 5
105 p6 p6.html 6
products_accounts
account_number | product_id
0000001 100
0000001 104
0000001 105
0000002 101
0000002 103
0000002 104
0000002 105
0000003 100
0000003 102
我嘗試了LEFT OUTER JOIN,但無法確定$ accountnumber是否與特定product_id的products_accounts表中的account_number匹配。 我能夠完成此操作的唯一方法是添加這樣的WHERE語句:
WHERE products_acccounts.account_number = '$accountnumber'
它為產品提供了適當的分類,但僅顯示了他們擁有的產品,而不是全部。
這是我的代碼:
$sql ="
SELECT
products.id,
products.name,
products.url,
products_accounts.account_number
FROM
products
LEFT OUTER JOIN
products_accounts
ON
products.id = products_accounts.product_id
";
$sql .="
GROUP BY
products.id
ORDER BY
products.weight
";
$result = mysql_query($sql);
while($row = mysql_fetch_array($result)) {
echo '<span class="'; if($row['account_number'] == '$accountnumber')
{ echo'product_yes">'; } else { echo 'product_no">'; }
echo '<a href="' . $row['url'] . '">' . $row['name'] . '</a><br /></span>';
}
如果客戶擁有除P2和P5以外的所有產品,則應這樣顯示:
✓P1
P2 ✓P3 ✓P4 P5 ✓P6
與SQL相比,使用SQL過濾掉行更好,如下所示:
$sql ="
SELECT
p.id,
p.name,
p.url,
pa.account_number
FROM
products p
LEFT OUTER JOIN
products_accounts pa
ON
p.id = pa.product_id
AND
pa.account_number = ".mysql_real_escape_string($accountnumber)."
ORDER BY
p.weight
";
$result = mysql_query($sql);
while($row = mysql_fetch_array($result)) {
echo '<span class="'; if(!is_null($row['account_number']))
{ echo'product_yes">'; } else { echo 'product_no">'; }
echo '<a href="' . $row['url'] . '">' . $row['name'] . '</a><br /></span>';
}
SELECT
products.id,
products.name,
products.url,
products_accounts.account_number
FROM
products
LEFT OUTER JOIN
(SELECT * FROM products_accounts WHERE account_number = $account_number) as products
ON
products.id = products_accounts.product_id
WHERE
";
$sql .="
GROUP BY
products.id
ORDER BY
products.weight
";
我認為這是您的答案,您需要在加入之前過濾您的加入表。 請檢查語法,因為我對php不太熟悉。
如果您要檢索所有記錄,則嘗試在沒有意義的上下文中使用GROUP BY
。 GROUP BY
子句僅應在要匯總數據(即獲取一堆記錄的總和,平均值等)時使用。
$getproducts = mysql_query("
SELECT id, name, url
FROM products
ORDER BY weight ASC");
while ($rowproducts = mysql_fetch_assoc($getproducts)) {
$product_id = $rowproduct['id'];
$product_name = $rowproduct['name'];
$product_url = $rowproduct['url'];
$getuserhasproduct = mysql_query("
SELECT DISTINCT product_id
FROM products_accounts
WHERE account_number = $accountnumber
AND product_id = $product_id");
$user_has_product = mysql_num_rows($getuserhasproduct);
if($user_has_product){
$class = "checked";
}
echo "<span class='$class'><a href='$product_url'>$product_name</a></span>";
unset($class);
} // end loop
這可能有助於提高性能
$getproducts = mysql_query("SELECT id, name, url,
(SELECT DISTINCT product_id
FROM products_accounts
WHERE account_number = '$accountnumber'
AND product_id = products.id) AS product_count
FROM products
ORDER BY weight ASC");
while ($rowproducts = mysql_fetch_assoc($getproducts)) {
$product_id = $rowproduct['id'];
$product_name = $rowproduct['name'];
$product_url = $rowproduct['url'];
$product_count = $rowproduct['product_count'];
if($product_count > 0){
$class = "checked";
}
echo "<span class='$class'><a href='$product_url'>$product_name</a></span>";
unset($class);
} // end loop
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.