Задавайте вопросы, мы ответим
Вы не зашли.
Есть база таблица t_propertiers
tov_id | property_id
1 ____|____ 10
1 ____|____ 11
1 ____|____ 12
2 ____|____ 10
2 ____|____ 13
3 ____|____ 10
3 ____|____ 11
4 ____|____ 10
4 ____|____ 14
Чтобы выбрать все товары у которых property_id принимают значения 10 (первый уровень, например "система мебели Бавария") И 11 (второй уровень, "кровать")
я пишу запрос
select tov_id, count(property_id) as cnt from t_propertiers where property_id in (10, 11) group by tov_id having cnt>1
И таким образом получу значения tov_id 1, 3 или/и число выбранных строк.
Сложность у меня в следующем, необходимо не одно количество товаров, скажем для значения 11 ("кровать"), а несколько количеств для 13 - "кресло", 14 - "мягкий уголок".
Можно конечно сделать 3 однотипных запроса, но это нерационально, особенно когда это категорий может достигать до 40 штук.
То есть, нужно получить сколько кроватей, кресел и уголков находится в базе.
Неактивен
Честно говоря, я не очень понял логику. Что такое "первый уровень" и "второй уровень"?
Неактивен
Magz написал:
Честно говоря, я не очень понял логику. Что такое "первый уровень" и "второй уровень"?
Первый уровень содержит в себе второй - подуровни.
Может быть несколько видов связи:
"тип мебели - элемент мебели"
или
"система мебели - элемент мебели"
Неактивен
Чтобы получить "красивый" запрос, нужно или добавить поле "Уровень" к данной таблице, или объединить в запросе с другой таблицей, где есть информация об уровнях.
Или я не правильно понимаю задачу. Какое количество Вы хотите посчитать? Сколько у Вас товаров первого уровня, у которых есть категории второго уровня? Или сколько товаров второго уровня заданной категории входит в товар первого уровня?
Неактивен
Magz написал:
Чтобы получить "красивый" запрос, нужно или добавить поле "Уровень" к данной таблице, или объединить в запросе с другой таблицей, где есть информация об уровнях.
Или я не правильно понимаю задачу. Какое количество Вы хотите посчитать? Сколько у Вас товаров первого уровня, у которых есть категории второго уровня? Или сколько товаров второго уровня заданной категории входит в товар первого уровня?
Второй вариант "сколько товаров второго уровня заданной категории входит в товар первого уровня"
Информации об уровнях нету - только подобные связи в одной таблице. (структура БД перенесена программистом из 1С)
Неактивен
Предлагаю программисту, переносящему данные из 1С в таком виде <strike>оборвать руки</strike> объяснить,
что он не прав.
В данных условиях попробуйте действовать по логике: Вам нужно найти товары, которые одновременно
удовлетворяют двум условиям: входят в «первый уровень» и во «второй уровень». После этого Вам нужно
сказать, в какие же категории (и сколько) они входят.
«Товары удовлетворяют первому уровню»:
SELECT tov_id FROM t_properties WHERE property_id = 10;
«Количество товаров по второму уровню»:
SELECT COUNT(tov_id), property_id FROM t_properties GROUP BY property_id
Ну и, наконец, «это одни и те же товары»
SELECT COUNT(DISTINCT tov_id), property_id
FROM t_properties
WHERE tov_id IN (SELECT tov_id FROM t_properties WHERE property_id = 10)
GROUP BY property_id
Или переписав без подзапроса
SELECT COUNT(DISTINCT a.tov_id), a.property_id
FROM t_properties a, t_properties b
WHERE a.tov_id = b.tov_id AND b.property_id = 10
GROUP BY a.property_id
Оно?
Неактивен
paulus написал:
Предлагаю программисту, переносящему данные из 1С в таком виде <strike>оборвать руки</strike> объяснить,
что он не прав.
«Количество товаров по второму уровню»:
SELECT COUNT(tov_id), property_id FROM t_properties GROUP BY property_id
Оно?
Тут я так понимаю пропущено условие.
Похоже на правду - буду пробовать. Спасибо, отпишусь как прошла операция
Неактивен
paulus написал:
Оно?
Таким образом получаем если у нас есть одна "родительская" категория, а если их будет штук 5, эти все запросы повторить в цикле?
Неактивен
Нет, условие там пропущено не было, там именно «вытащить все вторые уровни, привязанные
к первым». Условие налагается при объединении с первым запросом.
Если Вы придумаете, как отличать первый уровень от второго, можно будет сделать не в цикле.
Возможно, Вас устроит ... AND b.property_id IN (10, другой id первого уровня, ...)
Неактивен
Общими усилиями нашли решение как оказалось довольно простое
SELECT tov_id, property_id FROM `test` AS `t1` LEFT JOIN `test` AS `t2` ON `t1`.`tov_id` = `t2`.`tov_id` WHERE `t1`.`property_id` IN (11,12) AND `t2`.`property_id` = 10
Таким образом получаем не конкретное количество, а строки (tov_id, property_id)
Таким образом далее в цикле языка программирования можно узнать сколько элементов для 10, 11 и сколько для 10, 12
Всем спасибо за помощь
Неактивен