Php 获取期间生成链接vs创建期间生成链接
假设我有一张这样的桌子: 类别:Php 获取期间生成链接vs创建期间生成链接,php,mysql,Php,Mysql,假设我有一张这样的桌子: 类别: | cat_id | cat_name | |--------|----------| | 1 | tvs | | 2 | phones | | 3 | tablets | | product_id | product_name | product_category | |------------|-----------------|------------------| | 1 | tv
| cat_id | cat_name |
|--------|----------|
| 1 | tvs |
| 2 | phones |
| 3 | tablets |
| product_id | product_name | product_category |
|------------|-----------------|------------------|
| 1 | tv sony | 1 |
| 2 | tv samsung | 1 |
| 3 | phone htc | 2 |
| 4 | phone motorolla | 2 |
| 5 | tablet apple | 3 |
然后我有:
产品:
| cat_id | cat_name |
|--------|----------|
| 1 | tvs |
| 2 | phones |
| 3 | tablets |
| product_id | product_name | product_category |
|------------|-----------------|------------------|
| 1 | tv sony | 1 |
| 2 | tv samsung | 1 |
| 3 | phone htc | 2 |
| 4 | phone motorolla | 2 |
| 5 | tablet apple | 3 |
有人进入index.php,我从数据库中随机得到10个产品。为了创建链接,我必须再次获取数据库(获取类别名称),然后我可以执行类似于mysite.com/phones/4
(这将是指向phone motorola
的链接)
当然,10在服务器上不会太难,但它仍然是数据库上的另一个获取
另一个选项是在产品创建期间获取类别名称,并在其中生成链接,如:
| product_id | product_name | product_category | product_link |
|------------|-----------------|------------------|--------------|
| 1 | tv sony | 1 | tvs/1 |
| 2 | tv samsung | 1 | tvs/2 |
| 3 | phone htc | 2 | phones/3 |
| 4 | phone motorolla | 2 | phones/4 |
| 5 | tablet apple | 3 | tablets/5 |
然而,类别的名称可能会改变,因此链接将不再工作。那我该怎么办?还有其他方法吗?好的,在SQL中有一个非常强大的功能,叫做JOIN。SQL中的联接允许您基于键合并不同表中的列。通常,密钥是主键或外键 在您的情况下,您似乎有以下主键:cat\u id和product\u id 作为外键,您有:产品类别 根据数据库架构,您可以按如下方式查询表:
SELECT p.product_id, p.product_name, c.cat_name
FROM PRODUCTS p INNER JOIN CATEGORIES c
ON p.product_category = c.cat_id
通过此查询,您只需对数据库进行一次查询即可检索产品标识、产品名称和类别名称
下面是有关SQL=>
希望它能对您有所帮助。做看起来最简单的事情,只有当它成为问题时才担心优化。为什么您不在产品和类别表之间建立SQL联接以获得产品和类别名称?@Arrabidas92我不知道SQL联接,我正在边走边学习,但现在我有一个问题,在我的categories表中,我实际上有3列,第三列是:
categority\u parent
,它要么是空的,要么是带有父类别ID的整数,我怎么能用join呢?我想你有输入错误。这是摩托罗拉,而不是摩托罗拉,你是对的,这只是一个例子!(:谢谢,这非常有用,不过我有一个问题,我在categories表中有第三列,它是category\u parent
,是NULL
,或者是一个带有父类别id的整数。是否也有方法使用SQL JOIN来检索它?当然,您可以检索任何您想要的列。唯一的条件是要在表之间建立连接,正如我所说,它们必须以某种方式通过键链接。好的,另一个问题,您在列名之前使用了p.
,字母p
是否任意?好问题!在SQL中,您可以使用较短的别名重命名列名和表名。这里p和c是表产品和类别的别名。ISQL中的一个常见习惯是在很长的查询中使用别名来使用较短的名称。使用别名的另一个有用的情况是,有一个列具有相同的名称,但位于两个不同的表中。为了区分这两个列,必须在列名alias.column\u name前面加上别名。如果忘记加上别名,可能会有一个e错误,如“ambigous name of column”=SQL必须采用哪一列。我只选择p,因为p是表产品的第一个字母,c是类别。这是另一个常见习惯。