SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 01.05.2009 21:22:46

masterlelik
Участник
Зарегистрирован: 01.05.2009
Сообщений: 6

запрос в БД, узнать количество данных

Есть база таблица 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 штук.

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

Неактивен

 

#2 04.05.2009 17:43:14

Magz
Гуру
Откуда: Москва
Зарегистрирован: 18.09.2007
Сообщений: 112

Re: запрос в БД, узнать количество данных

Честно говоря, я не очень понял логику. Что такое "первый уровень" и "второй уровень"?

Неактивен

 

#3 04.05.2009 17:54:51

masterlelik
Участник
Зарегистрирован: 01.05.2009
Сообщений: 6

Re: запрос в БД, узнать количество данных

Magz написал:

Честно говоря, я не очень понял логику. Что такое "первый уровень" и "второй уровень"?

Первый уровень содержит в себе второй - подуровни.

Может быть несколько видов связи:
"тип мебели - элемент мебели"
или
"система мебели - элемент мебели"

Неактивен

 

#4 04.05.2009 18:11:07

Magz
Гуру
Откуда: Москва
Зарегистрирован: 18.09.2007
Сообщений: 112

Re: запрос в БД, узнать количество данных

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

Или я не правильно понимаю задачу. Какое количество Вы хотите посчитать? Сколько у Вас товаров первого уровня, у которых есть категории второго уровня? Или сколько товаров второго уровня заданной категории входит в товар первого уровня?

Неактивен

 

#5 04.05.2009 18:23:04

masterlelik
Участник
Зарегистрирован: 01.05.2009
Сообщений: 6

Re: запрос в БД, узнать количество данных

Magz написал:

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

Или я не правильно понимаю задачу. Какое количество Вы хотите посчитать? Сколько у Вас товаров первого уровня, у которых есть категории второго уровня? Или сколько товаров второго уровня заданной категории входит в товар первого уровня?

Второй вариант "сколько товаров второго уровня заданной категории входит в товар первого уровня"

Информации об уровнях нету - только подобные связи в одной таблице. (структура БД перенесена программистом из 1С)

Неактивен

 

#6 04.05.2009 21:14:02

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: запрос в БД, узнать количество данных

Предлагаю программисту, переносящему данные из 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

Оно?

Неактивен

 

#7 04.05.2009 23:33:15

masterlelik
Участник
Зарегистрирован: 01.05.2009
Сообщений: 6

Re: запрос в БД, узнать количество данных

paulus написал:

Предлагаю программисту, переносящему данные из 1С в таком виде <strike>оборвать руки</strike> объяснить,
что он не прав.

«Количество товаров по второму уровню»:
SELECT COUNT(tov_id), property_id FROM t_properties GROUP BY property_id

Оно?

Тут я так понимаю пропущено условие.

Похоже на правду - буду пробовать. Спасибо, отпишусь как прошла операцияsmile

Неактивен

 

#8 04.05.2009 23:38:30

masterlelik
Участник
Зарегистрирован: 01.05.2009
Сообщений: 6

Re: запрос в БД, узнать количество данных

paulus написал:

Оно?

Таким образом получаем если у нас есть одна "родительская" категория, а если их будет штук 5, эти все запросы повторить в цикле?

Неактивен

 

#9 05.05.2009 10:04:24

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: запрос в БД, узнать количество данных

Нет, условие там пропущено не было, там именно «вытащить все вторые уровни, привязанные
к первым». Условие налагается при объединении с первым запросом.

Если Вы придумаете, как отличать первый уровень от второго, можно будет сделать не в цикле.

Возможно, Вас устроит ... AND b.property_id IN (10, другой id первого уровня, ...)

Неактивен

 

#10 05.05.2009 13:01:45

masterlelik
Участник
Зарегистрирован: 01.05.2009
Сообщений: 6

Re: запрос в БД, узнать количество данных

Общими усилиями нашли решение как оказалось довольно простое
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

Всем спасибо за помощьsmile

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson