McLotos
17.10.2018 - 07:31
Всем привет. Видимо со всеми этими фреймворками совсем забыл как писать запросы, задача вроде простая, но никак не могу написать запрос так, чтобы обойтись без цикла на уровне php.
Есть таблица administrators из нее нужны поля id, name, position
Есть таблица shops из нее нужно количество магазинов, привязанных к каждому из администраторов через поле administrator_id
Есть таблица shop_delivery, привязанная к таблице shops через поле shop_id В таблице shop_delivery лежат связи shop_id с таблицей систем, систем много, нас интересуют 2 из них это 7 и 10
К каждому магазину может быть привязано множество систем, а может не быть ни одной
Нужно получить список всех администраторов, к каждому из них получить количество магазинов привязанных к этому администратору разделенных на категории
ФИО администратора | Магазины с доставкой | Магазины без доставки | Общее количество
Колонка "Общее количество" нужна потому-что некоторые магазины могут выполнять доставку условно (в зависимости от обстоятельств) поэтому один магазин может попасть в обе колонки (с доставкой и без) В итоге получается что колонка Общее количество показывает реальное количество магазинов на администраторе
В каждой из 3х колонок количества есть разделение на крупный, средний, мелкий. За это отвечает поле shop.shop_type
Я пробовал подходить с разных сторон (и со стороны таблицы администраторов и со стороны таблицы магазинов), но ни в одном из случаев не получается обойтись без циклов или подзапросов.
Подзапросы использовать не хочется, хотя ими можно решить эту задачу, а циклы в консольном мускуле не выполнить =)
_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
sergeiss
17.10.2018 - 09:26
А чем тебе подзапросы не нравятся? В данном случае, если их правильно написать, они как раз хорошо подойдут.
_____________
*
Хэлп по PHP*
Описалово по JavaScript *
Хэлп и СУБД для PostgreSQL*
Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги. *
"накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)
McLotos
17.10.2018 - 09:38
Цитата (sergeiss @ 17.10.2018 - 11:26) |
А чем тебе подзапросы не нравятся? В данном случае, если их правильно написать, они как раз хорошо подойдут. |
Потому-что дальше мне нужно будет воссоздать этот же запрос во всем известном бредофреймворке на букву L и придется писать кучу кода в его дурацком кверибилдере, если найти решение без подзапросов, то кода получится в разы меньше
_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
sergeiss
17.10.2018 - 12:55
Не вижу проблемы

Создай в БД вьюшку со всеми подзапросами и будешь вызывать её как самый примитивный запрос. Который в своем фреймворке напишешь элементарно.
_____________
*
Хэлп по PHP*
Описалово по JavaScript *
Хэлп и СУБД для PostgreSQL*
Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги. *
"накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)
McLotos
17.10.2018 - 15:09
select
`administrators`.`id`,
`administrators`.`name`,
`administrators`.`position`,
`shops`.`shop_type`,
count(distinct(pos.shop_id)) as total_pos_count,
count(distinct(nonpos.shop_id)) as total_nonpos_count,
count(distinct(shops.id)) as total_all_count
from `administrators`
inner join `shops` on `administrator_id`=`administrators`.`id`
and `shops`.`deleted_at` is null
left join `shop_delivery` as `pos` on `pos`.`shop_id`=`shops`.`id`
and `pos`.`system_id` in (73,79)
and `pos`.`deleted_at` is null
left join `shop_delivery` as `nonpos` on `nonpos`.`shop_id`=`shops`.`id`
and `nonpos`.`system_id` not in (73,79)
and `nonpos`.`deleted_at` is null
group by `shops`.`shop_type`
как-то так получилось, можно еще повозиться чтобы вообще для каждого администратора получать только 1 строку результата
_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки