Осталось присоединиться и принадлежит

У меня есть три таблицы: товары (идентификатор, имя), категории (идентификатор, имя) и products_categories (product_id, category_id).

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

Я хочу получить все продукты и показать, какие из них уже есть в категории «X».
Мои divs такие:

   <span>Category "X"</span>
[some php / fetch_assoc() / … ]
<div class="product">Product A</div>
<div class="product selected">Product B</div>
<div class="product">Product B</div>

На данный момент он работает с двумя запросами: один для извлечения всех продуктов и один для проверки, находится ли продукт в products_categories. Так что это много маленьких запросов с php внутри первого.

$getAllProducts = "SELECT products.name as productName, products.id as productID FROM products";
$resultProduct=$mysqli->query($getAllProducts);
while($product=$resultProduct->fetch_assoc()){
$reqChecked = "SELECT * FROM products_categories
WHERE product_id=" .  $product["productID"] ."AND category_id=" . $category["id"]; //$category["id"] is given
$resultChecked = $mysqli->query($reqChecked);
$row = $resultChecked->fetch_row();
$selected = ""if ( isset($row[0]) ) {
$selected = "selected";
}

Это можно сделать только одним запросом? Я пытался с оставил присоединиться (products_categories on products), но продукты, относящиеся к нескольким категориям, перечислены для каждой категории, в которой они находятся.

РЕДАКТИРОВАТЬ

Вот некоторые примеры данных

Таблица продуктов

+----+-----------+
| id |   name    |
+----+-----------+
|  1 | product_1 |
|  2 | product_2 |
|  3 | product_3 |
+----+-----------+

таблица категорий

+----+------------+
| id |    name    |
+----+------------+
|  1 | category_1 |
|  2 | category_2 |
|  3 | category_3 |
+----+------------+

столик

+------------+-------------+
| product_id | category_id |
+------------+-------------+
|          1 |           1 |
|          1 |           2 |
|          2 |           2 |
+------------+-------------+

Теперь предположим, что я на странице редактирования category_2 и хочу получить следующий результат:

+------------+--------------+-------------+
| product_id | product_name | category_id |
+------------+--------------+-------------+
|          1 | product_1    | 2           | --product_1 belongs to category_1 and category_2, but I only need it one time.
|          2 | product_2    | 2           |
|          3 | product_3    | NULL        | --product_3 belongs to nothing but I want to see it.
+------------+--------------+-------------+

2

Решение

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

SELECT p.id,
p.name AS product,
c.name AS category       -- check for value 'X' in your PHP code
FROM products p
INNER JOIN products_categories pc
ON p.id = pc.product_id
INNER JOIN categories c
ON c.id = pc.category_id

Обратите внимание, что ваш текущий подход на самом деле пытается объединить сам код PHP, что нежелательно по многим причинам.

Обновить:

SELECT t1.id AS product_id,
t1.name AS product_name,
CASE WHEN t2.productSum > 0 THEN '2' ELSE 'NA' END AS category_id
FROM products t1
LEFT JOIN
(
SELECT product_id,
SUM(CASE WHEN category_id = 2 THEN 1 ELSE 0 END) AS productSum
FROM products_categories
GROUP BY product_id
) t2
ON t1.id = t2.product_id
4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector