Подсчет рабочих в бизнесе с филиалами

#php #mysql #laravel #count

#php #mysql #laravel #подсчет

Вопрос:

Выберите группу, в которой есть один Основной и, например, 5 Филиал. Итак, общее количество мест таково 6 . В каждом из них 6 ищите 3 работников, которые работают как job_types LIKE "%C%" . Если в одном из этих 6 мест находятся 3 рабочие с заданным параметром, запрос должен получить результаты по всем этим 6 местам.

Чтобы уточнить: 3 работники должны работать в одном главном / филиале.

Поскольку сам проект очень сложен, было бы лучше получить результаты, используя НЕОБРАБОТАННЫЙ запрос:

деловой стол

 id     |    mainorbranch    |    name
--------------------------------------
1           Main                 Apple
2           Branch               Apple London
3           Branch               Apple Manchester
4           Main                 IBM
5           Branch               IBM London
etc ...
 

Отношения

таблица business_branches

 b_id     |    branch_id    |    id
--------------------------------------
1             1                 1
2             2                 1
3             3                 1
4             4                 4
5             5                 4
// etc
 

таблица people_details

 d_id     |    id    |    job_types
--------------------------------------
1             1          C
2             3          D
3             2          F
4             4          C
5             5          C
// etc
 

таблица people_branches

 pb_id     |    branch_id    |    id
--------------------------------------
1              1                 3
2              3                 2
3              4                 4
4              2                 5
5              1                 1
// etc
 

Что мне нужно получить:

 Business id    |    Name    |    Postcode
-----------------------------------------
1                   Apple        postcode
2                   Apple 232    postcode
3                   Apple 323    postcode
// etc...
 

Структура БД для Помощников
http://sqlfiddle.com /#!9/206733

Упрощенный, уменьшенный SQL-файл с общим количеством строк более 110 тыс.

Обновить

Ответ от @KikiTheOne вроде как работает, но дает только половину результата. Другая половина отсутствует.

Комментарии:

1. Извини, что я здесь заблудился.

2. Этот вопрос помечен как Laravel; вы ожидаете помощи в построителе запросов или Eloquent? Если это не так, вероятно, следует удалить тег Laravel.

3. @RichardHousham например, существует группа из 1 основного и 3 филиалов. Найдите 3 "%C%" в каждом из 4 мест. Если true , отобразите всю информацию об этих 4 местах. (1 основная, 3 ветви).

4. @JofryHS минутку, пожалуйста.

5. обновлен вопрос @JofryHS.

Ответ №1:

как обсуждалось в чате. вот такое решение:

если вам нужна информация о компании… получите их @ t1.XXXX как postcode .

я изменился

 "pb_id" "branch_id" "id"
"1" "1" "3"
"2" "3" "2"
"3" "1" "4"
"4" "1" "5"
"5" "1" "1"
 

итак, я получаю 3 человека в 1 филиале

 SELECT 
    t1.id as "Business id",
    t1.name as Name,
    'postcode' as "Postcode" 
FROM SO_business as t1 inner join 
(
    SELECT * FROM SO_busness_branches as t3 
    inner join 
    (
        SELECT 
            t5.branch_id as inner_branch,
            count(t5.branch_id) as workers_in,
            max(t6.job_types) as job_types,
            max(t7.id) as mainbranch
        FROM 
            SO_people_branches as t5
                inner join SO_people_details as t6
                    on t5.id = t6.id 
                inner join SO_busness_branches as t7 
                    on t5.branch_id = t7.branch_id 
        WHERE 
            t6.job_types LIKE '%C%' 
        GROUP BY 
            t5.branch_id
    ) as t4
        on t3.id = t4.inner_branch 
    WHERE t4.workers_in >= 3
) as t2 
    on t1.id = t2.branch_id
 

Объяснение:

-.1 Самый внутренний SQL подсчитывает ВСЕ ветви с рабочими (количество инициализированных рабочих) и Job_type = %c% и присоединяет ОСНОВНОЙ идентификатор ветки.

-.2 второй SQL получает эту информацию и выбирает только все ветви с рабочими>= 3

-.3 внешний SQL выбирает всю внутреннюю информацию и возвращает ВСЕ ветви / main с BranchId-Main из внутреннего SQL. И подключает их к бизнес-таблице, чтобы вы могли отображать всю информацию, например postcode, оттуда

Ответ №2:

надеюсь, что это сработает, поскольку не так просто интерпретировать отношения с именем столбцов в вашем вопросе.

С помощью этого скрипта вы можете добавить любую группу main / branch для поиска в

 SELECT b.id, b.name, 'postcode' as postcode 
FROM business b
INNER JOIN business_branches bb ON (bb.branch_id = b.id)
WHERE bb.id IN (
  SELECT bb1.id FROM people_details pd
  INNER JOIN people_branches pb ON (pb.id = pd.id)
  INNER JOIN business_branches bb1 ON (bb1.branch_id = pb.branch_id)
  INNER JOIN business b1 ON (b1.id = bb1.branch_id)
  WHERE
  pd.job_types like '%C%' AND
  bb1.id IN (1,4) -- You can add as many group of businesses (main/branch combinations) using the main branch key
  GROUP BY pb.branch_id HAVING count(pb.branch_id) >= 3
)