Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP如何显示两个表中的行_Php_Mysql - Fatal编程技术网

PHP如何显示两个表中的行

PHP如何显示两个表中的行,php,mysql,Php,Mysql,我有两个表格,即“类别”和“产品”,如下所示: categories id | name products id | cat_id | name 产品中的cat_id引用类别表 现在,我想在一个页面上显示所有产品的列表,该页面还必须显示产品所属类别的名称(而不是cat_id)。 我对PHP非常陌生,因此我采用以下方式: foreach($products as $product): echo $product->id . $product->name;

我有两个表格,即“类别”和“产品”,如下所示:

categories
id | name

products
id | cat_id | name
产品中的cat_id引用类别表

现在,我想在一个页面上显示所有产品的列表,该页面还必须显示产品所属类别的名称(而不是cat_id)。 我对PHP非常陌生,因此我采用以下方式:

   foreach($products as $product):
       echo $product->id . $product->name;
       echo getCategoryName($product->cat_id);
   endforeach;
很明显,检索相应类别名称的数据库调用等于要显示的产品数量,有些东西告诉我这一点都不好


那么,有没有更好的方法来实现上述目标?也许通过使用SQL连接?

是的,您需要SQL连接。大概是这样的:

类别id |名称

产品标识|类别标识|名称

select categories.name, products.id, products.name
from categories, products
where categories.id = products.cat_id

是的,你需要一个sql连接。大概是这样的:

类别id |名称

产品标识|类别标识|名称

select categories.name, products.id, products.name
from categories, products
where categories.id = products.cat_id

您应该使用SQLJOIN,这是迄今为止从两个表中选择数据的最好、最简单的方法

SELECT 
  p.id AS id, c.name AS category, p.name AS name 
FROM
  products AS p LEFT JOIN categories AS c ON p.cat_id = c.id
您也可以使用Trevor的语句,但这是一种不同类型的连接。在这种情况下,只要产品ID始终存在,两者都可以工作


更新:关于
左连接
右连接
的一些更新。当您从两个表中进行选择时,您有一个左表和右表(此处左侧为产品,右侧为类别)。我给您的查询将匹配所有产品,即使该类别不存在。
右连接将匹配所有类别,即使该类别中没有产品。

您应该使用SQL连接,这是迄今为止从两个表中选择数据的最佳且最简单的方法

SELECT 
  p.id AS id, c.name AS category, p.name AS name 
FROM
  products AS p LEFT JOIN categories AS c ON p.cat_id = c.id
您也可以使用Trevor的语句,但这是一种不同类型的连接。在这种情况下,只要产品ID始终存在,两者都可以工作


更新:关于
左连接
右连接
的一些更新。当您从两个表中进行选择时,您有一个左表和右表(此处左侧为产品,右侧为类别)。我给您的查询将匹配所有产品,即使该类别不存在。
右连接将匹配所有类别,即使该类别中没有产品。

-11989调用。他们希望隐式
where
join语法返回。请使用显式连接语法。他是一个试图帮助。。。不要因为他太苛刻而马上杀了他。隐式where联接有很多问题,因为它们混合了联接条件和筛选条件。因此,它们不被视为最佳实践。由于向后兼容,它们仍然可以工作,但请不要使用它们,因为您将无法在SO:-)-11989中获得升级投票。他们希望隐式
where
join语法返回。请使用显式连接语法。他是一个试图帮助。。。不要因为他太苛刻而马上杀了他。隐式where联接有很多问题,因为它们混合了联接条件和筛选条件。因此,它们不被视为最佳实践。由于向后兼容,它们仍然有效,但请不要使用它们,因为在SO:-)@kilZone中您将无法获得升级投票,这是相同的连接。只是另一种语法。@KilZone,在这种情况下,当使用
左连接时,如果类别不存在,将显示什么?它是否还包括没有与
类别id关联的类别?例如,当它从数据库中删除时(通常通过外键强制执行)。反过来呢?无论如何,我要说的是,始终使用显式联接,因为您对它有更多的控制。同样,如果category表有另一个名为“status”的字段,其值1表示active,0表示inactive,该怎么办。现在,如果我只想列出活动类别的产品,sql语句会是什么样子?@Damchey它会显示正常的行,除了
category
是空的。因此,结果将是
1 | | product name
,这是“最安全的”,因为您的数据库中永远不会有无法访问的语句(那些您无法访问的语句,因为某些键不存在)。还要注意的是,在我的查询中,您可以获得数据(在PHP中)为
id
category
name
(但您可能已经知道了)。@kilZone,这是相同的连接。只是另一种语法。@KilZone,在这种情况下,当使用
左连接时,如果类别不存在,将显示什么?它是否还包括没有与
类别id关联的类别?例如,当它从数据库中删除时(通常通过外键强制执行)。反过来呢?无论如何,我要说的是,始终使用显式联接,因为您对它有更多的控制。同样,如果category表有另一个名为“status”的字段,其值1表示active,0表示inactive,该怎么办。现在,如果我只想列出活动类别的产品,sql语句会是什么样子?@Damchey它会显示正常的行,除了
category
是空的。因此,结果将是
1 | | product name
,这是“最安全的”,因为您的数据库中永远不会有无法访问的语句(那些您无法访问的语句,因为某些键不存在)。还请注意,在我的查询中,您可以获得数据(在PHP中)为
id
category
name
(但您可能已经知道这一点)。