Вопрос о присоединении к MySQL

Привет, я изо всех сил пытаюсь написать конкретный запрос на присоединение к MySQL.

У меня есть таблица, содержащая данные о продуктах, каждый продукт может принадлежать к нескольким категориям. Это отношение m: m выполняется с помощью таблицы ссылок.

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

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

Моя упрощенная схема разработана примерно следующим образом:

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

product_id, name, title, description, is_active, date_added, publish_date, etc....

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

category_id, name, title, description, etc...

таблица product_category:

product_id, category_id

Я написал следующий запрос, который позволяет мне получить все продукты, принадлежащие указанному category_id. Однако я действительно изо всех сил пытаюсь понять, как получить другие категории, к которым принадлежит продукт.

SELECT p.product_id, p.name, p.title, p.description
FROM prod_products AS p
LEFT JOIN prod_product_category AS pc
ON pc.product_id =  p.product_id
WHERE pc.category_id = $category_id
AND UNIX_TIMESTAMP(p.publish_date) < UNIX_TIMESTAMP()
AND p.is_active = 1
ORDER BY p.name ASC

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

Большое спасибо,

Ричард


person rbaker86    schedule 26.04.2010    source источник


Ответы (2)


Вы бы использовали внутреннее соединение с таблицей product_category, выполнение левого соединения там бессмысленно, поскольку вы используете значение из него в условии. Затем вы выполняете левое соединение в таблице product_category, чтобы получить другие категории, и присоединяетесь к категориям для данных:

select
  p.product_id, p.name, p.title, p.description,
  c.category_id, c.name, c.title
from
  prod_products p
  inner join prod_product_category pc on pc.product_id = p.product_id
  left join prod_product_category pc2 on pc2.product_id = p.product_id
  left join prod_categories c on c.category_id = pc2.category_id
where
  pc.category_id = @category_id and
  unix_timestamp(p.publish_date) < unix_timestamp() and
  p.is_active = 1
order by
  p.name
person Guffa    schedule 26.04.2010

person    schedule
comment
Великолепно, большое спасибо. Я никогда не думал о повторном соединении этой таблицы и использовании оператора not. - person rbaker86; 27.04.2010