2012-01-24 58 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>'; 
} 
相关问题