MYSQL - ВЫБРАТЬ продукты, ГДЕ родительская_категория активна - PullRequest
0 голосов
/ 25 февраля 2019

при условии, что у нас есть структура категории базы данных, подобная этой

# Categories Table
| category_id | parent_category_id | status |

# Products Table
| product_id | category_id |

как мне получить список продуктов в категории , только если parent_category_id имеет активный status = 1?

Полагаю, я мог бы использовать некоторый подзапрос в выражении SELECT, но я не знаю как!: (

что-то вроде:

SELECT p.*, (SELECT * FROM ? WHERE ? ) AS x 
FROM products AS p 
    LEFT JOIN categories AS c ON p.category_id = c.category_id 
WHERE ... 
AND p.product_id = '?' 
AND ...

Заранее благодарен за любые советы!

Примечание: я использую PHP в качестве языка бэкэнда, просто вна случай, если мне понадобятся какие-то манипуляции с данными, чтобы перейти к запросу MySQL.

Ответы [ 4 ]

0 голосов
/ 25 февраля 2019

Сначала вы должны получить все активные категории

SELECT child.*
FROM Categories child
JOIN Categories parent
  ON child.parent_category_id = parent.category_id 
 AND parent.status = 1

Но вам также нужны корневые категории без parent_id

SELECT *
FROM Categories
WHERE parent_category_id IS NULL
  AND status = 1

Таким образом, вы ОБЪЕДИНЯЕТЕ оба

SELECT *
FROM Categories child
JOIN Categories parent
  ON child.parent_category_id = parent.category_id 
 AND parent.status = 1

UNION ALL

SELECT *
FROM Categories
WHERE parent_category_id IS NULL
  AND status = 1

Теперь вы получаете товары для этих категорий

SELECT *
FROM (  ... UNION ALL ... ) active_categories
JOIN Products
 ON active_categories.category_id = Product.category_id 
0 голосов
/ 25 февраля 2019
SELECT p.* FROM products p
INNER JOIN categories child ON child.category_id = p.category_id
INNER JOIN categories parent ON parent.category_id = child.parent_category_id
WHERE parent.status=1
0 голосов
/ 25 февраля 2019

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

SELECT 
   *
FROM
   products, categories
WHERE
   products.category_id = categories.category_id
   AND status = '1'

0 голосов
/ 25 февраля 2019

старайтесь не использовать подзапрос, потому что это может повлиять на скорость загрузки данных

возможно, это может помочь

SELECT *
FROM categories c
INNER JOIN products p ON p.category_id=c.category_id
WHERE c.status = 1
...