Как я могу создать один запрос для всех значений из более чем 1 таблицы, где округ равен «baawa». Я использую PHP для подключения к базе данных.
Что я пробовал:
SELECT (
SELECT * FROM health WHERE county='baawa'
),
(
SELECT * FROM hotspots WHERE county='baawa'
),
(
SELECT * FROM markets WHERE county='baawa'
),
(
SELECT * FROM schools WHERE county='baawa'
),
(
SELECT * FROM security WHERE county='baawa'
)
Изменить: таблицы имеют различное количество столбцов.
Столбцы столбцов:
Здоровье
facility_id,
название,
опека,
место нахождения,
лат,
долгота,
штат сотрудников,
staff_category,
состав,
чрезвычайные ситуации,
conflict_cases,
communication_facility,
мощность
Hotspots
название,
лат,
долгота,
опека,
место нахождения,
mgt_committee,
безопасность,
тип
рынок
market_id,
название,
опека,
место нахождения,
лат,
долгота,
mgt_committee,
безопасность
Школы
Полные тексты,
school_id,
название,
уровень,
опека,
место нахождения,
лат,
долгота,
ученики,
staff_no,
peace_club,
conflict_affected
Безопасность
security_id,
название,
опека,
место нахождения,
лат,
долгота,
штат сотрудников,
состав,
транспорт,
связь,
мощность,
преступления,
Разрешения
Поскольку запросы SQL возвращают двумерные наборы строк, выходные данные должны иметь согласованный набор столбцов. Поэтому невозможно выполнить один запрос к нескольким существенно различным таблицам и создать вывод, включающий все столбцы для всех задействованных таблицсм сноска. Если вы хотите, чтобы все столбцы были доступны, такие как SELECT *
будет производить 5 отдельных запросов и извлекать строки по отдельности.
С вашей существующей структурой, чтобы получить объединенный набор строк всех этих идентичных, вам нужно будет связать их вместе с UNION ALL
используя шаблон:
SELECT col1, col2 FROM health WHERE county = 'baawa'
UNION ALL
SELECT col1, col2 FROM hotspots WHERE county = 'baawa'
UNION ALL
SELECT col1, col2 FROM markets WHERE county = 'baawa'
UNION ALL....
SELECT col1, col2 FROM schools WHERE county = 'baawa'
UNION ALL
SELECT col1, col2 FROM security WHERE county = 'baawa'
/* ORDER BY applies to the whole rowset */
ORDER BY col2 DESC, col1 ASC
Уловка в том, что вы можете получить только столбцы, которые общий для всех таблицы с использованием этого метода в упрощенном виде, который я сделал здесь. Просматривая структуры таблиц, я вижу общие столбцы: name, ward, location, lat, lon
, Таким образом, вы должны перечислить их в том же порядке в каждом UNION
компоненты SELECT
,
Обратите внимание, что я делаю не использование SELECT *
на UNION
запрос. Если только таблицы именно так то же самое, имея столбцы, определенные точно в том же порядке, SELECT *
не будет производить столбцы в том же порядке, и ваш вывод не будет иметь смысла, потому что они не выравниваются по UNION
столы
При выполнении UNION
запрос важно четко указать порядок столбцов в SELECT
список. В вашем случае это было бы невозможно в любом случае, потому что таблицы значительно различаются.
Если вам нужно включить в результирующий запрос один или два других столбца, которые не являются общими для всех таблиц, вы Можно сделай это в SELECT
список, добавив NULL
в UNION
компоненты, где столбец не существует. Например mgt_committee
столбец для 2, где он существует, и NULL
где это не так:
/* NULL as mgt_committee where column doesn't exist in table... */
SELECT col1, col2, NULL AS mgt_committee FROM health WHERE county = 'baawa'
UNION ALL
SELECT col1, col2, mgt_committee FROM hotspots WHERE county = 'baawa'
UNION ALL
SELECT col1, col2, mgt_committee FROM markets WHERE county = 'baawa'
UNION ALL
SELECT col1, col2, NULL AS mgt_committee FROM schools WHERE county = 'baawa'
UNION ALL
SELECT col1, col2, NULL AS mgt_committee FROM security WHERE county = 'baawa'
Сноска:
Единственный способ включить все столбцы из всех таблиц в одну SELECT
было бы перечислить надмножество всех из них, как я сделал с mgt_committee
, имея в виду все столбцы из всех таблиц должны быть представлены в каждый компонент UNION
, с NULL
замена столбцов, которые не существуют. Не делай этого, это не имеет смысла.
Других решений пока нет …