Php 如何显示SQL表中的所有记录并将这些记录与另一个表匹配?
我已经将PHP变量$accountnumber设置为查看其个人资料页面的用户的变量。在页面上,我有一个块,其中包含从数据库填充的用户信息,我有一个我们拥有的所有产品的列表,我想通过为客户分配一个类,在每个产品旁边打一个复选标记 这是我的桌子:Php 如何显示SQL表中的所有记录并将这些记录与另一个表匹配?,php,mysql,sql,Php,Mysql,Sql,我已经将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
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
我尝试了左外部联接,但无法确定$accountnumber是否与products_accounts表中特定product_id的account_编号匹配。我能够完成此操作的唯一方法是添加一个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>';
}
如果要检索所有记录,则尝试在没有意义的上下文中使用GROUP BY。GROUP BY子句仅在您希望聚合数据(即获取一组记录的总和、平均值等)时使用。如果您希望检索所有记录,则尝试在没有意义的上下文中使用GROUP BY。GROUP BY子句仅在您希望聚合数据(即获取一组记录的总和、平均值等)时使用
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
我想这就是你的答案,你需要在加入之前过滤你的加入表。请检查语法,因为我对php不太熟悉。使用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>';
}
与PHP相比,使用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>';
}
这可能有助于提高性能
$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
这可能有助于提高性能
$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
否,如果我不使用GROUP BY,它将显示每个产品的次数与在products_accounts表中显示的次数相同。我希望每个产品显示一次。对于用户拥有的产品,它应该对其应用一个类。对于拥有除P2和P5之外的所有产品的用户,其显示方式如下:✓P1 P2✓P3✓P4 P5✓P6@nitsuj:不能使用分组依据并选择未聚合的列数据;结果没有任何意义……但结果是有意义的。它正在显示所有产品,就像我希望的那样-我只需要为包含在帐户id记录中的产品分配一个类。你能告诉我怎么做吗?@nitsuj:不,它们不是。对于具有多个帐户的产品,您将获得每个产品id的随机帐户号。在您的示例数据中,对于产品id 105,有两个帐号:000001和000002。您的查询将只随机返回这两个帐号中的一个,因为您使用了分组依据。否,如果我不使用分组依据,则它将显示每个产品的次数与它在产品账户表中显示的次数相同。我想显示每个产品一次。对于用户拥有的产品,它应该对其应用一个类。对于拥有除P2和P5之外的所有产品的用户,其显示方式如下:✓P1 P2✓P3✓P4 P5✓P6@nitsuj:不能使用分组依据并选择未聚合的列数据;结果没有任何意义……但结果是有意义的。它正在显示所有产品,就像我希望的那样-我只需要为包含在帐户id记录中的产品分配一个类。你能告诉我怎么做吗?@nitsuj:不,它们不是。对于具有多个帐户的产品,您将获得每个产品id的随机帐户号。在您的示例数据中,对于产品id 105,有两个帐号:000001和000002。您的查询只会随机返回这2个帐号中的1个,因为您使用了GROUP BY。对此我感觉很好!:我是对的!你是对的!我把它复制粘贴到我的文本编辑器中,只需修改三件事就可以了!1.修复了一个印刷错误-复数行产品与while语句匹配。。。。。。2.在account_number='$accountnumber'和product_id='$product_id'中的值周围添加了一个引号。。。。。。3.将$class更改为我已经安装好的类,并添加了}else{$class='product_no'}我知道你要修复第一个类,不确定是否需要第二个修复,因为它对我来说总是很好,但MySQL有时可能会很怪!第一次编辑很好,我试着快速打字,在工作时表现得好像不在这个网站上:是的,这是必要的。没有它,一切都被检查了。在尝试左外部联接之前,我的第一次尝试是对这个方法做一些事情——在while语句中放入一个查询,但我做得不太对,所以我认为这个方法是错误的。谢谢你清理它!顺便说一句-感谢您在工作时访问本网站!救了我一天!:这将是
比直接在sql语句中处理过滤要慢得多。你可能想考虑一个纯SQL解决方案中的一个其他答案的性能的萨基有一个很好的感觉,这是:我是对的!你是对的!我把它复制粘贴到我的文本编辑器中,只需修改三件事就可以了!1.修复了一个印刷错误-复数行产品与while语句匹配。。。。。。2.在account_number='$accountnumber'和product_id='$product_id'中的值周围添加了一个引号。。。。。。3.将$class更改为我已经安装好的类,并添加了}else{$class='product_no'}我知道你要修复第一个类,不确定是否需要第二个修复,因为它对我来说总是很好,但MySQL有时可能会很怪!第一次编辑很好,我试着快速打字,在工作时表现得好像不在这个网站上:是的,这是必要的。没有它,一切都被检查了。在尝试左外部联接之前,我的第一次尝试是对这个方法做一些事情——在while语句中放入一个查询,但我做得不太对,所以我认为这个方法是错误的。谢谢你清理它!顺便说一句-感谢您在工作时访问本网站!救了我一天!:这将比直接在sql语句中处理过滤慢得多。为了性能的缘故,您可能需要考虑其他答案中的一个纯SQL解决方案。