[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Список товарных групп с количеством товаров
Хиросим
Приветствую.
Уперся с вроде бы простой задачкой.
Есть таблица со списком товарных групп id | parent_id | group_name (около 300 записей)
Есть таблица товаров id | group_id | item_name (около 45 000 записей)
Есть банальная задача вывести список групп с количеством товаров в каждой
пробую так
"SELECT G.* , COUNT(C.id) AS `count`
FROM `"
.DB_GROUPS."` AS G
LEFT JOIN `"
.DB_CATALOG."` AS C ON C.`group_id` = G.`id`
GROUP BY C.`group_id`
ORDER BY G.`parent_id`, G.`group_name`"

Обработка идет полторы минуты и результат какой то кривой, все группы с parent_id = 0 схлопываются, выводится только первая.
В общем явно что то я делаю не так, подскажите как правильно такие задачи решать.
dvs
Хиросим, попробуй RIGHT JOIN и как это у тебя по двум полям идет сортировка?
Kusss
SELECT 
g.name , COUNT(t.id) AS number
FROM
`group` AS g
LEFT JOIN
`tovar` AS t ON t.`group_id` = g.`id`
GROUP BY
g.id

или можно так
SELECT 
g.name ,
(
SELECT COUNT(t.id) FROM `tovar` AS t WHERE t.`group_id` = g.id) AS number
FROM
`group` AS g
Хиросим
dvs а в чем проблема отсортировать по двум полям? По моему стандартная ситуация, сначала сортировка идет по номеру группы, потом, в рамках каждой группы по алфавиту.

Kusss второй вариант вроде корректно отрабатывает, но блин 157.13065719604 секунд
У меня эта задача двумя запросами и одним циклом за 0,2 секунды отрабатывает, хотел код упростить и второй день череплю не пойму где косяк.
dvs
Хиросим, сори не знал, первый вариант у меня работает с group by g.id
Kusss
туплю
SELECT 
COUNT(t.id) AS number, g.name
FROM
`tovar` AS t
LEFT JOIN
`group` AS g ON g.id = t.group_id
GROUP BY
t.group_id
Хиросим
Парни, у вас этот запрос быстро работает потому что у вас база мелкая, наверное тестовая.
Kusss
такой вариант не подходит.
Таблица с группами заточена под дерево
id | parent_id | group_name
1 | 0 | group_name1
2 | 0 | group_name2
3 | 1 | group_name1-1
4 | 2 | group_name2-1
В таблице с товарами фигурируют только конечные группы, корневых там нет.
Поэтому, если выборку начинать с товаров, то отваливаются все группы высших уровней, а мне нужен список всех.
Если же выборка начинается с таблицы групп, то JOIN работает странно, почему то схлопывает корневые группы в одну. Так и не понял почему.
Решение вроде получилось из второго варианта от Kusss

"SELECT G.*, (SELECT COUNT(t.id) FROM `".PRICE."` AS t USE INDEX(group_id) WHERE t.`group_id` = g.id)  AS `count`
FROM `"
.DB_GR."` AS G
ORDER BY G.`parent_id`, G.`name`"


Великая вешчь индексы! 157 сек превратились в 0,427
Valick
Цитата
Таблица с группами заточена под дерево

nested sets для хранения деревьев в реляционной БД

Цитата
Великая вешчь индексы!

естественно

_____________
Стимулятор ~yoomoney - 41001303250491
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.