UNION, SUM и count (*) вместе в запросе PHP SQL - PullRequest
0 голосов
/ 09 ноября 2019

Итак, у меня есть php SQL-запрос, который запрашивает этажи и общее количество рабочих станций на каждом этаже.

config_location_workstation  workstation          asset_inventory

floor                        floor                floor
workstation_number           workstation_number   workstation_number
workstation_name             assigned_user
(production|non-production)  machine_type

У меня есть таблица config_location_workstation, которая состоит из пола, workstation_number, workstation_name (Production, Non-Production).

Затем у меня есть таблица asset_workstation, которая состоит из floor, workstation_number, assign_user,machine_type (ноутбук, рабочий стол). workstation_number содержит все номера рабочих станций пользователей на этаже.

У меня также есть таблица asset_inventory, в которой также есть floor и workstation_number каждой машины.

Мне удалось запросить общее количество рабочих станций на этаже. Но мне также нужно вытащить все имя рабочей станции с именем «Production». Мне нужно объединить все таблицы, чтобы создать один запрос, чтобы получить общее количество каждой рабочей станции, количество машин, развернутых на каждом этаже, общее количество голов на этаже. Мне нужно получить количество всех рабочих станций пользователей для каждого имени рабочей станции (производственное, непроизводственное).

Это текущий код, который мне нужен, чтобы поднять этажи и общее количество рабочих станций.

$query=mysqli_query($conn,"SELECT workstation.floor, COUNT(*) TOTAL FROM ( SELECT floor FROM config_location_workstation UNION ALL SELECT floor FROM asset_workstation ) AS workstation GROUP BY floor ORDER BY floor");

Я ожидаю вывода

+-------+-------------+------+------+------+------+-----+
| Floor | Head Count  | Workstations| Machines Deployed |
+-------+-------------+------+------+------+------+-----+
| 6TH   | 100         | 150         | 140               |
| 18TH  | 200         | 250         | 200               |
| 19TH  | 300         | 320         | 310               |
+-------+-------------+------+------+------+------+-----+

Как я собираюсь сделать это в одном запросе.

1 Ответ

2 голосов
/ 12 ноября 2019

Ваши таблицы не нормализованы: по всей видимости, во всех 3 таблицах есть дублирующаяся информация. (если workstation_number не является уникальным и floor / workstation_number не является составным ключом. Я бы посоветовал против этого ...)

Я бы предложил схему, аналогичную этой (предполагая отношение многих ко многим между пользователями ирабочие станции):

Workstation              User_Workstation     User
id                 <- -  workstation_id     
workstation_number       user_id         - -> id
machine_type                                  name
name
floor

Каждое из полей в Workstation описывает атрибут рабочей станции. Любая информация, которую вы могли собрать из двух других таблиц, теперь находится в одном месте. Не повторяйте себя! Дублирующиеся данные зло .

Цель:

Мне нужноОбъедините все таблицы, чтобы получить один запрос, чтобы получить общее количество

  • каждой рабочей станции,
  • машин, развернутых на каждом этаже,
  • общее количество голов на этаже.
  • Мне нужно получить количество всех рабочих станций для каждого пользователя на одно имя рабочей станции (производственное, непроизводственное).

По отдельности это кусок пирога. (И, если вы запускаете скрипт для получения результатов, это все, что вам нужно)

select count(id) number_of_workstations
from Workstation;

select count(id) workstations_per_floor, floor
from Workstation
group by floor

select count(u.id) users_per_floor, floor
from Workstation w
inner join User_Workstation uw on w.id = uw.workstation_id
inner join User u on u.id = uw.user_id
-- optionally filter by production or non-production
-- where w.name = ?
group by w.floor

Но ваш желаемый результат, похоже, отличается:

+-------+-------------+------+------+------+------+-----+
| Floor | Head Count  | Workstations| Machines Deployed |
+-------+-------------+------+------+------+------+-----+
| 6TH   | 100         | 150         | 140               |
| 18TH  | 200         | 250         | 200               |
| 19TH  | 300         | 320         | 310               |
+-------+-------------+------+------+------+------+-----+

I 'Я предполагаю, что Head Count - это количество пользователей на этаже, Workstations - это общее количество рабочих станций на этаже, а Machines Deployed - это ... Понятия не имею. Производство?

select floor, count(u.id) Head_Count, count(distinct w.id) Workstations, -- ??? as Machines_Deployed
from workstation w
left join user_workstation uw on w.id = uw.workstation_id
left join user on u.id = uw.user_id
group by w.floor

(я изменю это на основе отзывов о том, что такое Machines Deployed)

...