Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: получить список товаров в глубину категорий
 
 автор: Jackson   (27.02.2012 в 23:56)   письмо автору
 
 

Есть уровни категорий товаров. Нужно получить список всех товаров для категории самого высокого уровня (двигаясь вниз)

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

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

  Ответить  
 
 автор: cheops   (28.02.2012 в 00:48)   письмо автору
 
   для: 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

  Ответить  
 
 автор: Jackson   (28.02.2012 в 01:42)   письмо автору
 
   для: 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   (02.03.2012 в 23:28)   письмо автору
 
   для: Jackson   (28.02.2012 в 01:42)
 

А как получить id категории, в которой нет ни одного товара? Т.е. в product_xref .category_id не найдено совпадений с category.id.

  Ответить  
 
 автор: cheops   (02.03.2012 в 23:35)   письмо автору
 
   для: Jackson   (02.03.2012 в 23:28)
 

При объединении таблиц в FROM используйте не оператор запятая, а LEFT JOIN, тогда тогда данные из обединяемой таблицы будут представлены как NULL, COUNT() насчитает 0 записей (можно на NULL ориентироваться, можно на COUNT(), только в последнем случае для составления условия придется использовать HAVING).

  Ответить  
 
 автор: Jackson   (03.03.2012 в 00:43)   письмо автору
 
   для: 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

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

  Ответить  
 
 автор: cheops   (03.03.2012 в 00:59)   письмо автору
 
   для: 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

  Ответить  
 
 автор: Jackson   (03.03.2012 в 01:25)   письмо автору
 
   для: cheops   (03.03.2012 в 00:59)
 

Спасибо, то что надо!

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования