2012-01-24 56 views
1

我已經將PHP變量$ accountnumber設置爲查看其個人檔案頁面的用戶。在頁面上,我用數據庫填充了用戶信息的一個塊,並且我有一個我們擁有的所有產品的列表,並且我希望在每個客戶旁邊放置一個複選標記,方法是分配一個類給它。如何顯示SQL表中的所有記錄並將這些記錄與另一個表進行匹配?

這裏是我的表:

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匹配的products_accounts表的ACCOUNT_NUMBER特定的product_id。我能夠做到這一點的唯一方法是添加一個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 

回答

0
$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 
+0

我對此感覺良好! :)而我是對的!你是對的!我複製並粘貼到我的文本編輯器中,只需要修復三件事情即可使用! _1。修復了印刷錯誤 - 複數「rowproducts」以匹配while語句......_ _2。在「WHERE account_number ='$ accountnumber'AND product_id ='$ product_id'」......中添加了一個單引號......_ _3.將$ class更改爲我已經設置並添加了「 } else {$ class ='product_no';} _ – nitsuj

+0

我知道你會修復一個類,不確定是否第二個修復是必要的,因爲它對我來說總是可以正常工作,但是有時候MySQL可能會很時髦!第一次編輯,那就是我試圖快速打字,並在我工作時像我不在這個網站:) – bowlerae

+0

是的,這是必要的。沒有它,一切都被檢查。我嘗試左外部之前的第一次嘗試join是爲了做這個方法 - 在while語句中加入一個查詢,但是我沒有把它做得很正確,所以我認爲這個方法是錯誤的。謝謝你清理它! – nitsuj

0

你如果您想要檢索所有的內容,則嘗試在上下文中使用GROUP BY記錄。 GROUP BY子句只應用於如果要彙總數據(即獲得一堆記錄的總和,平均值等)。

+0

不,如果我不使用'GROUP BY' ,它將顯示每個產品的次數,與在products_accounts表中顯示的次數一樣多。 – nitsuj

+0

我想要顯示每個產品一次。對於用戶擁有的產品,它應該對它應用一個類。 對於具有除P2和P5的所有產品用戶,它會顯示這樣的: '✓P1 P2 ✓P3 ✓P4 P5 ✓P6' – nitsuj

+0

@nitsuj:你不能用'GROUP BY'並選擇未彙總的列數據;結果沒有任何意義...... – FtDRbwLXw6

1
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。

2

這是更好地過濾掉使用SQL比PHP行,象下面這樣:

$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>'; 
} 
相關問題