PHP MySQL несколько SQL-запросов или JOIN для каждого запроса

0

Если у меня есть две таблицы с соответствующими столбцами:

=====================
product_categories
=====================
id | name
=====================

=======================
products
=======================
id | category_id | name
=======================

И у меня есть следующие функции PHP:

// Returns an array of all rows from the products
function getProducts() { ... } 

// returns the corresponding row to the given id of the product category
function getProductCategory($category_id) { ... } 

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

  • Я бы
  • категория
  • название

Где категория - это название категории, соответствующей category_id продукта.

В настоящее время я использую цикл foreach для итерации продукта и вызова функции getProductCategory(...) для каждого продукта:

<?php
...

$products = getProducts();

foreach ($products as $product) {
    $product_category = getProductCategory($product['category_id']);
    ...
}

...
?>

Что будет большим количеством запросов к базе данных, если есть много продуктов со многими повторяющимися запросами.

Было бы хорошей практикой, если getProducts() включает всю информацию о своей категории с помощью JOIN в инструкции SQ L?

  • 1
    Я бы предложил вам создать другой метод. getProducts () выглядит как простая операция CRUD, то, что вам нужно, она более «настроена». Рекомендуется создавать пользовательский запрос с полями, которые вы хотите, с точки зрения производительности.
Теги:
function
join

2 ответа

1
Лучший ответ

Если вы хотите получить id, category_name и product_name доступно каждый раз, вы должны сделать один метод и избегать, чтобы сделать один select, затем foreach по каждому продукту и прочий select, чтобы получить все значения.

Поэтому попробуйте что-то вроде этого, может быть:

function getProductsData() {

    $querie = 'SELECT 
                 p.id, p.name,
                 pc.name as Category
               FROM products as p
               LEFT JOIN product_categories as pc on pc.id = p.category_id
               ORDER BY p.name; -- optionnal
              ';

    // Get the data and return them
    // You should get an array with one row = 
    // id (of the product) / name (of the product) / Category (the name of the category)


}
1

Да, Присоединиться будет лучше. Это уменьшит количество запросов для получения категории. В противном случае вы можете сделать отдельный запрос для получения категорий, как указано ниже, но я предлагаю Join.

$products = getProducts();
$categoryIds = [];
foreach ($products as $product) {
    $categoryIds[] = $product['category_id'];
    ...
}
$product_category = getProductCategory($categoryIds);

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню