Как соединить две таблицы MySQL

У меня есть в моей базе данных MySqli таблица под названием «продукты».

Products TABLE 
product_id       | INT      primary KEY
product_name     | VARCHAR(50)
product_price    | float

Из PHP я ввожу строки в таблицы продуктов следующим образом:

   mysqli_query($con,"INSERT INTO products (product_id,product_name,product_price) VALUES 
                                           ('$product_id','$product_name','$price')");                                      

Пока все работает отлично. Теперь я хочу иметь вторую таблицу под названием «категория», эта таблица будет включать в себя все возможные категории, которые может иметь продукт.

В таблице категорий должны быть столбцы category_id и category_name.

Category TABLE 
category_id       | INT      primary KEY
category_name     | VARCHAR(50)

Я пытаюсь найти способ связать продукт с категорией в моем файле PHP.

  for example:
  $get=mysqli_query($con, "SELECT * FROM `category`");
  while ($row = mysqli_fetch_assoc($get)) { 
         echo $row['category_name'];   //...here show all the categories
         //...
         //.. pick the category that the product belong
         $category_Selected= .....;
                    }?>
   ..... And make the connection (with INSERT? or something) between product and category

Я хочу иметь возможность, когда я выполняю поиск в таблице продуктов (для продукта X), отображать также и категорию, к которой он принадлежит (пока я могу показать Product_id, product_name и product_price)

Спасибо

вы должны добавить столбец category_id в таблицу product, чтобы разрешить соединение между двумя таблицами, или добавить таблицу для управления связью между двумя таблицами.

ScaisEdge 10.02.2019 15:45
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
106
3

Ответы 3

Вы хотите присоединиться к своим столам.

Посмотрите здесь:

Присоединяйтесь к таблицам - w3schools

Синтаксис таблиц соединения MySQL

@Tim S спасибо за ваш ответ. Я пытаюсь использовать JOIN, но таким образом я не могу установить соединение INSERT. категория таблицы не имеет ROW "product_id", также таким образом (из моих попыток) я не могу <<сохранить>> каким-то образом событие, что продукт X принадлежит категории A и наоборот

Aegean 10.02.2019 15:49

если вы хотите создать отношение m:n, вам может понадобиться вспомогательная таблица, такая как «product_category_mn» с полями product_id и category_id. посмотрите здесь: dba.stackexchange.com/questions/151904/…

Tim S 10.02.2019 15:58

Если продукт может быть только в одной категории, вы можете добавить category_id в свою таблицу «Продукты».

Я бы предложил третью таблицу:

Product_category
id         | PK
product_id | Foreign key to Products.id
category_id| Foreign key to Categories.id

Теперь каждый раз, когда вы вставляете продукт, вам нужно также получить идентификатор вашей категории и выполнить оператор вставки в таблицу Product_category.

Чтобы получить ваши данные, вы можете сделать что-то вроде этого:

 $get=mysqli_query($con, "SELECT * FROM `category`");
    while ($row = mysqli_fetch_assoc($get)) {

      echo $row['category_name'];   //...here show all the categories

      $products=mysqli_query($con, "SELECT * FROM `Products` WHERE id IN 
      (SELECT product_id from Product_category WHERE category_id= ".(int)$row['category_id'] . ")");

      while ($product = mysqli_fetch_assoc($products)) {

           echo $product["product_name"] . ", " . $product["product_price"]; 

      }
    }

Приведенное выше утверждение является примером, вы можете использовать JOIN и подготовленные операторы.

Если вы решите изменить таблицу продуктов и добавить туда category_id, то пример кода будет таким:

 $get=mysqli_query($con, "SELECT * FROM `category`");
    while ($row = mysqli_fetch_assoc($get)) {

      echo $row['category_name'];   //...here show all the categories
      $products=mysqli_query($con, "SELECT * FROM `Products` WHERE category_id = " . (int) $row["category_id"]);

      while ($product = mysqli_fetch_assoc($products)) {

           echo $product["product_name"] . ", " . $product["product_price"]; 

      }
    }

Как бы то ни было, ваша база данных не позволяет вам представить взаимосвязь между категориями и продуктами. Вам нужно будет изменить свой дизайн.

Я могу представить, что один продукт относится к категории, и что в одной категории может быть несколько продуктов.

Если это так, я бы рекомендовал создать таблицу categories для хранения категорий с (как минимум) столбцами category_id и category_name.

CREATE TABLE categories (
    category_id INT PRIMARY KEY AUTO_INCREMENT,
    category_name VARCHAR(100)
);

В таблице продуктов вы хотите добавить столбец в таблицу products, в котором хранится ссылка на идентификатор соответствующей категории:

ALTER TABLE products ADD 
    COLUMN category_id INT 
    FOREIGN KEY (category_fk) REFERENCES categories(id) ON DELETE CASCADE;

С этим измененным дизайном базы данных, когда вы вставляете в products, вы передаете ссылку на категорию (можно ожидать, что пользователь вашего приложения выберет ее из какого-то выпадающего списка при создании продукта):

INSERT INTO products (product_id, product_name, product_price, category_id) 
VALUES ( :product_id, :product_name, :price, :category_id );

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

SELECT p.*, c.category_name
FROM products p
INNER JOIN categories c ON c.category_id = p.category_id
WHERE p.produt_id = :product_id

PS: никогда не передавайте значения POSTed в ваши SQL-запросы следующим образом: это подвергает вас SQL-инъекциям (а также делает ваши запросы менее читабельными и эффективными). Я изменил запросы, чтобы использовать именованные параметры.

Другие вопросы по теме