2010-05-17 3 views
0

Мне нужно получить данные из четырех таблиц. Я написал сценарий с четырьмя запросами, но я использую его в ajax, и я не сделаю это одним запросом. здесь запросы ...один запрос вместо четырех - возможно ли это?

$query1 = "SELECT `id`,`name_ar` FROM `tour_type` ORDER BY `order`"; 
$query2 = "SELECT `id`,`name_ar` FROM `hotel_type` ORDER BY `order`"; 
$query3 = "SELECT `id`,`name_ar` FROM `food_type` ORDER BY `order`"; 
$query4 = "SELECT `id`,`name_ar` FROM `cities` WHERE `id_parrent` = '$id_parrent' ORDER BY `name_ar`"; 

возможно написать в одном запросе? благодаря

структура таблиц tour_type

id | name_ar | name_ru | name_en | order | 

food_type 
id | name_ar | name_ru | name_en | order | 

hotel_type 
id | name_ar | name_ru | name_en | order | 

cities 
id | id_parrent | name_ar | name_ru | name_en | order | 
+1

Большинство ответов хороши с помощью 'UNION (ALL)' так или иначе. Я просто хотел бы подчеркнуть, что менее важно, что имена столбцов одинаковы среди всех ваших таблиц, но типы данных столбцов должны быть совместимы. – van

ответ

4

Функция UNION [ALL] позволит вам объединить несколько запросов, но тип данных и порядок столбцов должны быть одинаковыми между всеми запросами. Кроме того, UNION удалит дубликаты, делая его медленнее, чем с помощью UNION ALL (который не удаляет дубликаты).

При этом утверждения UNION не допускают ORDER BY для каждого оператора, но MySQL поддерживает это, если вы помещаете запрос в скобки. Использование:

(SELECT id, name_ar FROM tour_type ORDER BY order) 
UNION ALL 
(SELECT id, name_ar FROM hotel_type ORDER BY order) 
UNION ALL 
(SELECT id, name_ar FROM food_type ORDER BY order) 
UNION ALL 
(SELECT id, name_ar FROM cities WHERE id_parent = ? ORDER BY name_ar) 
+0

Да, магия UNION ALL состоит в том, что она оставляет нетронутый результат, поэтому он сохраняет порядок для отдельных запросов. Обязательно используйте предложение @David M сверху, добавив столбец типа. –

+0

@Marcus Adams: Конечно ... если это необходимо (или попросили). Я не вижу такого требования. –

1

быстрый и простой способ будет попробовать UNION из четырех select заявлений. Пока количество столбцов одинаковое, а имена столбцов одинаковы, ваша система базы данных должна позволить вам с этим справиться.

Мы, возможно, не должны попасть в реляционное моделирование/дизайн, так как существует много разных мнений и стилей, но ... Если они все просто «типы», то, возможно, они должны быть в одной таблице. Так много разных способов кожи этого кота.

+0

Некоторые ссылки будут полезны – Simon

+1

Имена столбцов не обязательно должны быть одинаковыми. MySQL будет использовать имена первых столбцов, которые указаны. –

+4

Для утверждения UNION/UNION ALL может быть только одно предложение ORDER BY. –

2

Несомненно, используйте UNION. Вы можете включить псевдо-столбец об источнике строки, если это важно для вас:

SELECT id,name_ar,'tour' FROM tour_type 
UNION 
SELECT id,name_ar,'hotel' FROM hotel_type 
UNION 
SELECT id,name_ar,'food' FROM food_type 
UNION 
SELECT id,name_ar,'cities' FROM cities WHERE id_parrent = $id_parrent 

Вам может понадобиться, чтобы играть вокруг с тем, что ORDER вы хотите.

+0

Для утверждения UNION/UNION ALL может быть только одно предложение ORDER BY. OP указывает ORDER BY для каждого оператора ... –

+0

Обязательно укажите тип имени столбца, например ''tour' AS row_type',' 'hotel' AS row_type'. –

+0

+1 для псевдостолбца. Также я бы назвал это столбец именем и использовал бы UNION ALL вместо UNION, чтобы избежать ненужного сортировки и фильтрации, поскольку мы знаем apriori, что нет совпадений. – van

0

Я думаю, что вы можете сделать это с помощью UNION, как это:

SELECT `id`,`name_ar` FROM `tour_type` ORDER BY `order` 

UNION 

SELECT `id`,`name_ar` FROM `hotel_type` ORDER BY `order` 

Это до вас, чтобы использовать UNION или использовать UNION ALL. более конкретные примеры можно посмотреть здесь Union sqlserver

0

Поскольку у вас есть постоянное количество колонок, вы могли бы объединение их вместе с каким-то идентификатором ключа, например:

select 'TBL1' as table_identifier, id, name from TBL1 
union 
select 'TBL2' as table_identifier, id, name from TBL2 
... 

Но 4 запросов, которые написаны хорошо, сопоставляемый с отдельными объектами, был бы лучше спроектирован, и если вы не отчаянно нуждаетесь в этих дополнительных миллисекундах, я бы придерживался хорошего дизайна над быстрым и грязным запросом.

Смежные вопросы