У меня есть таблица с объектами objects
Так же есть различные услуги (трансфер, питание, доп. услуги) соответственно transfer, eat, dops
Связь между объектом и услугами осуществляется через промежуточные таблицы соответственно: transfer_for_objects, eat_for_objects, dops_for_objects
К объекту может быть закреплены 3 услуги, а может быть и ни одной. Задача такова: отсортировать объекты по количеству прикрепленных услуг в порядке убывания. У кого-нибудь есть какие то предположения как реализовать?
Можно сделать выборку с 3мя join , которая будет агрегировать в виртуальное поле сумму услуг привязанных к конкретному объекту, в последствии по этому полю сделать orderBy('field_name', 'desc') приблизительный пример.
SELECT *, COUNT(tfo.id) + COUNT(efo.id) + COUNT(dfo.id) AS services_total_count FROM objects AS obj JOIN transfer_for_objects AS tfo ON tfo.obj_id = obj.id JOIN eat_for_objects AS efo ON efo.obj_id = obj.id JOIN dops_for_objects AS dfo ON dfo.obj_id = obj.id WHERE 1 ORDER BY obj.services_total_count
Как и в первом варианте - только считать сумму не в mysql, а например сделать просто выборку по объектам с данными о кол-ве услуг, в последствии пройтись по массиву в ответе в помощью данной функции http://php.net/manual/en/function.uasort.php Выбор метода скорее лежит в плоскости быстродействия.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей