[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Задачка на group
Shuriken
Доброго времени суток!

Есть две коробки. В эти коробки периодически кладётся разное количество шариков. Это пишется в таблицу box_ball с полями box_id и cnt_ball. Необходимо посчитать количество шариков в коробках. Это просто:
SELECT b.name, SUM(cnt_ball)
FROM box_ball bb
INNER JOIN box b ON b.id = bb.box_id
WHERE 1
GROUP BY b.name
ORDER BY b.name


Коробку 1 поставили в коробку 2. Количество шариков в первой коробке не изменилось, а вот во второй стало количество в первой коробке + количество во второй.

Как в данном случае вывести количество шариков для второй коробки?

Коробок может быть бесконечно много, но заранее известно, что коробка 1 находится в коробке 2.
T1grOK
Цитата (Shuriken @ 17.04.2017 - 07:20)
Коробок может быть бесконечно много, но заранее известно, что коробка 1 находится в коробке 2.

То есть, одна коробка внутри коробки, и бесконечно много коробок (которые не содержат в себе коробки)?
Вложенность коробок только на логическом уровне или есть физическое поле принадлежности коробки к коробке?

_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
Shuriken
Цитата (T1grOK @ 17.04.2017 - 10:16)
Цитата (Shuriken @ 17.04.2017 - 07:20)
Коробок может быть бесконечно много, но заранее известно, что коробка 1 находится в коробке 2.

То есть, одна коробка внутри коробки, и бесконечно много коробок (которые не содержат в себе коробки)?

Да. Если необходимо, то можно добавлять поля в таблицу.
T1grOK
Навскидку, можно решить добавив 2 JOIN.

_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
Shuriken
Цитата (T1grOK @ 17.04.2017 - 10:32)
Навскидку, можно решить добавив 2 JOIN.

Можно пример?
T1grOK
Цитата (T1grOK @ 17.04.2017 - 08:32)
Навскидку, можно решить добавив 2 JOIN.

Не учел, что в box_ball, несколько записей к box.
Как то так можно решить:

SELECT box.name, SUM(subq.sum)
FROM box
INNER JOIN (
SELECT b.id, b.name, SUM(bb.cnt_ball) as sum
FROM box_ball bb
INNER JOIN box b ON b.id = bb.box_id
GROUP BY b.id
) subq ON subq.id = box.id OR (subq.name = 1 AND box.name = 2)
GROUP BY box.id


_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
Shuriken
Спасибо, работает, но можно его переписать немного проще


SELECT b1.name, SUM(bb.cnt_ball) as sum
FROM box_ball bb
INNER JOIN box b ON b.id = bb.box_id
INNER JOIN box b1 ON b.id = b1.id OR (b.id = 1 AND b1.id = 2)
GROUP BY b1.id
Быстрый ответ:

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