簡體   English   中英

PHP mySQL JOIN和顯示(3表)

[英]PHP mySQL JOIN and display (3 tables)

嗨,我是 php 的新手,我的學習項目試圖解決一些挑戰

我有 3 個表“產品”、“類別”、“product_to_categories”

產品表:

product_id    product_name    product_price    product_img    product_link    date
1             item1_name      item1_price      item1_img      item1_link      item1_date
2             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  

我試圖得到兩件事:

  1. 列出所有產品以及它們所屬的所有類別名稱(無 ID)。
  2. 僅列出屬於給定類別的產品

不幸的是,我不知道如何解決這個問題。

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> "; }?>

這真的是關於 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

對於第一個問題:您應該使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM