@alexfyodrv

Как сгрупировать данные из двух таблиц по одной колонке?

Подскажите пожалуйста как я могу сгрупировать данные из двух таблиц по значению value?
В таблицах "data1, data2" хранятся статусы разных типов и мне нужно сделать общую таблицу где показать какое количество пользователей имеют этот статус.

$query = User::leftJoin('data1', 'data1.user_id', '=', 'users.id')
            ->leftJoin('data2', 'data2.user_id', '=', 'users.id')
            ->select('data1.text as value', 'data2.name as value', DB::raw('count(*) as users_count'))
            ->groupBy('value')
            ->orderByDesc('users_count');
  • Вопрос задан
  • 87 просмотров
Решения вопроса 1
idShura
@idShura
select d.value,
       count(*) users_count 
  from user u

left join (select user_id, data1.text value from data1
            union all
           select user_id, data2.name value from data2
           ) d on d.user_id = u.id

group by d.value
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
erge
@erge
Примус починяю
опоздал... ))

м... вопрос - зачем лефт джойн? имхо не нужен.

не знаю как это в ваших ларавелях, в SQL примерно так думаю:
SELECT t.value, count(*) as users_count
  FROM users u
  JOIN (
    SELECT d1.text as value, d1.user_id FROM data1 d1
    UNION
    SELECT d2.name as value, d2.user_id FROM data2 d2
  ) t on t.user_id = u.id
  GROUP BY t.value
  ORDER BY users_count DESC


PS: если нужно считать И совпадающие в data1 и data2 записи, то UNION заменить на UNION ALL

UPD: просто выполните сырой select
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы