PHP mySQL JOIN и отображение (3 таблицы) - PullRequest
1 голос
/ 29 мая 2020

Привет, я новичок в 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  

Я пытаюсь получить 2 вещи:

  1. написать список всех продуктов вместе с именами всех категорий (без идентификаторов), к которым они принадлежат.
  2. перечислить только те продукты, которые принадлежат к данным категориям

К сожалению, я не знаю, как к этому подойти.

показать_продукты. 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 ]

2 голосов
/ 29 мая 2020

Это действительно о языке SQL и об обучении его использованию. Надеюсь, у вас есть GUI для вашей базы данных, такой как PhpMyAdmin или Heidi SQL, потому что часто проще использовать его при написании кода 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
0 голосов
/ 29 мая 2020

По первому вопросу: вы должны использовать предложение JOIN , чтобы иметь возможность связывать продукты с категориями по их идентификатору:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...