один запрос вместо четырех - это возможно? - PullRequest
1 голос
/ 17 мая 2010

я должен получить данные из четырех таблиц. я написал скрипт с четырьмя запросами, но я использую его в 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 |

Ответы [ 5 ]

4 голосов
/ 17 мая 2010

Функция 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)
2 голосов
/ 17 мая 2010

Конечно, используйте 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 1006 *.

1 голос
/ 17 мая 2010

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

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

0 голосов
/ 17 мая 2010

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

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

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

0 голосов
/ 17 мая 2010

Я думаю, что вы можете сделать это, используя 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...