为了账号安全,请及时绑定邮箱和手机立即绑定

PHP mySQL JOIN 和显示(3 个表)

PHP mySQL JOIN 和显示(3 个表)

PHP
拉莫斯之舞 2023-04-23 17:52:58
我是 php 的新手,我的研究项目试图解决一些挑战我有 3 个表“产品”、“类别”、“product_to_categories”产品表:product_id    product_name    product_price    product_img    product_link    date1             item1_name      item1_price      item1_img      item1_link      item1_date2             item2_name      item2_price      item2_img      item2_link      item2_date类别表:category_id    category_name    1              category1_name      2              category2_name     3              category3_name     和 product_to_categories 表:relation_id    product_id    category_id    1              product1_id   category1_id     2              product1_id   category2_id      3              product2_id   category1_id  4              product2_id   category3_id  我想得到两件事:写下所有产品的列表以及它们所属的所有类别名称(无 ID)。仅列出属于给定类别的产品不幸的是,我不知道如何处理这个问题。show_products.php:<?php$per_page=100;    if(isset($_GET['page'])){        $page = $_GET['page'];    }else{        $page=1;    }    $start_from = ($page-1) * $per_page;    $get_products = "SELECT * FROM products ORDER BY 1 DESC LIMIT $start_from,$per_page";    $run_products = mysqli_query($conn,$get_products);    while($row_products=mysqli_fetch_array($run_products)){        $pro_id = $row_products['product_id'];        $pro_name = $row_products['product_name'];        $pro_price = $row_products['product_price'];        $pro_img = $row_products['product_img'];        $pro_link = $row_products['product_link'];        $pro_date = $row_products['date'];        echo "         <tr>            <td style='width: 70px'>$pro_id</td>            <td><img src='../p_img/$pro_img' style='width:70px;'></td>            <td>$pro_name</td>            <td>ok. $pro_price zł</td>            <td>$pro_link</td>            <td></td>            <td>$pro_date</td>          </tr>        ";    }?>
查看完整描述

2 回答

?
婷婷同学_

TA贡献1844条经验 获得超8个赞

这实际上是关于 SQL 语言和学习如何使用它的。希望您的数据库有一个 GUI,例如 PhpMyAdmin 或 HeidiSQL,因为在编写 SQL 代码时通常更容易使用它。


假设您有这些表:


CREATE TABLE products

(

    product_id int PRIMARY KEY,

    product_name varChar(255)   

);


CREATE TABLE categories

(

    category_id int PRIMARY KEY,

    category_name varChar(255)

);


CREATE TABLE product_to_categories

(

    product_id int,

    category_id int,

   FOREIGN KEY (product_id) REFERENCES products(product_id),

   FOREIGN KEY (category_id) REFERENCES categories(category_id)

);

使用此示例数据:


INSERT INTO products VALUES (1, 'Product 1'), (2, 'Product 2');

INSERT INTO categories VALUES (1, 'Category 1'), (2, 'Category 2');

INSERT INTO product_to_categories VALUES (1,1), (2,1), (2,2);

您可以使用此长格式查询来获取数据:


SELECT

    P.*,

    C.category_name

FROM

    products P

JOIN 

    product_to_categories PC

    ON

    P.product_id = PC.product_id

JOIN

    categories C

    ON

    PC.category_id = C.category_id

哪个返回


1   Product 1   Category 1

2   Product 2   Category 1

2   Product 2   Category 2

但是,因为您在连接表中使用相同的列名,您还可以使用该NATURAL JOIN命令生成相同的列名


SELECT

    P.*,

    C.category_name

FROM

    products P

NATURAL JOIN

    categories C

NATURAL JOIN

    product_to_categories


要从单个类别中获取产品,您可以使用:


SELECT

    *

FROM

    products P

NATURAL JOIN

    product_to_categories PC

WHERE

    PC.category_id = 2

返回


2   Product 2   2


查看完整回答
反对 回复 2023-04-23
?
杨魅力

TA贡献1811条经验 获得超5个赞

对于第一个问题:您应该使用JOIN 子句才能通过产品 ID 将产品与类别相关联:

SELECT

    p.product_name,

    c.category_name,

FROM

    products p

JOIN

    products_categories pc ON p.product_id = pc.product_id

JOIN

    categories c ON pc.category_id = c.category_id

对于第二个问题:当你关联两个表时,你可以通过在连接中添加一个 where 子句来过滤你正在连接的表的结果:


SELECT

    p.product_name

FROM

    products p

JOIN

    products_categories pc ON p.product_id = pc.product_id AND pc.category_id = 1


查看完整回答
反对 回复 2023-04-23
  • 2 回答
  • 0 关注
  • 135 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信