Php 如何显示SQL表中的所有记录并将这些记录与另一个表匹配?

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

我已经将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
我尝试了左外部联接,但无法确定$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解决方案。