|
|
|
| Есть уровни категорий товаров. Нужно получить список всех товаров для категории самого высокого уровня (двигаясь вниз)
CREATE TABLE `category` (
`id` int(3) NOT NULL,
`name` varchar(32) NOT NULL
) ENGINE=MyISAM;
CREATE TABLE `category_xref` (
`parent` int(3) NOT NULL,
`child` int(3) NOT NULL
) ENGINE=MyISAM;
CREATE TABLE `product` (
`id` int(3) NOT NULL,
`name` varchar(32) NOT NULL,
`price` float(7) NOT NULL
) ENGINE=MyISAM;
CREATE TABLE `product_xref` (
`product_id` int(3) NOT NULL,
`category_id` int(3) NOT NULL
) ENGINE=MyISAM;
|
составил запрос, получающий список только для указанной категории
SELECT product.name, product.price
FROM product, category, product_xref
WHERE product_xref.category_id =5
AND category.id = product_xref.category_id
AND product.id = product_xref.product_id
|
Подскажите пожалуйста, как дополнить список товарами, которые входят в дочерние категории | |
|
|
|
|
|
|
|
для: Jackson
(27.02.2012 в 23:56)
| | Обычно делают так, рекурсивно для каждого из каталога вычисляют список подкаталогов, сохраняют его в отдельной таблице, а потом просто подставляют его вместо условия category.id = product_xref.category_id, задействовав оператор IN
SELECT product.name, product.price
FROM product, category, product_xref
WHERE product_xref.category_id =5
AND category.id IN (34, 54, 128)
AND product.id = product_xref.product_id
|
SELECT product.name, product.price
FROM product, category, product_xref
WHERE product_xref.category_id =5
AND category.id IN (SELECT id FROM tbl WHERE id_catalog = product_xref.category_id)
AND product.id = product_xref.product_id
|
| |
|
|
|
|
|
|
|
для: cheops
(28.02.2012 в 00:48)
| | Спасибо, получилось!
только оператор IN на строчку выше
SELECT product_name, product.price
FROM product, category, product_xref
WHERE product_xref.category_id
IN (
SELECT child
FROM category_xref
WHERE parent =2
)
AND category.id = product_xref.category_id
AND product.id = product_xref.product_id
LIMIT 0 , 30
|
| |
|
|
|
|
|
|
|
для: Jackson
(28.02.2012 в 01:42)
| | А как получить id категории, в которой нет ни одного товара? Т.е. в product_xref .category_id не найдено совпадений с category.id. | |
|
|
|
|
|
|
|
для: Jackson
(02.03.2012 в 23:28)
| | При объединении таблиц в FROM используйте не оператор запятая, а LEFT JOIN, тогда тогда данные из обединяемой таблицы будут представлены как NULL, COUNT() насчитает 0 записей (можно на NULL ориентироваться, можно на COUNT(), только в последнем случае для составления условия придется использовать HAVING). | |
|
|
|
|
|
|
|
для: cheops
(02.03.2012 в 23:35)
| | был такой вариант:
SELECT c.name, p.category_id
FROM category c
LEFT JOIN product_xref p ON c.id = p.category_id
|
просто что на выходе много лишнего... нельзя запрос так составить, что б уже в самом результате были только нужные строки? | |
|
|
|
|
|
|
|
для: Jackson
(03.03.2012 в 00:43)
| | Попробуйте так
SELECT
c.name,
COUNT(p.category_id) AS total
FROM
category c
LEFT JOIN
product_xref p
ON
c.id = p.category_id
GROUP BY
c.id
HAVING
total = 0
|
| |
|
|
|
|
|
|
|
для: cheops
(03.03.2012 в 00:59)
| | Спасибо, то что надо! | |
|
|
|