2015-08-21 2 views
0

Я надеюсь, что я могу выполнить это с помощью одного запроса к базе данных:Можно ли объединить эти 4 запроса в один более эффективный запрос?

// These four variables can change... 
$weave = 10; 
$grade = 4; 
$model = 1; 
$brim = 7; 

Теперь у меня есть эти 4 запросов:

SELECT WeaveDesc FROM store_item_weaves WHERE ID = '$weave' LIMIT 1 
SELECT GradeDesc FROM store_item_grades WHERE ID = '$grade' LIMIT 1 
SELECT ModelDesc FROM store_item_models WHERE ID = '$model' LIMIT 1 
SELECT BrimDesc FROM store_item_brims WHERE ID = '$brim' LIMIT 1 

Можно ли объединить все это в один более эффективный запрос?

ответ

1

Попробуйте это:

SELECT 
    (SELECT WeaveDesc FROM store_item_weaves WHERE ID = '$weave' LIMIT 1) AS WeaveDesc, 
    (SELECT GradeDesc FROM store_item_grades WHERE ID = '$grade' LIMIT 1) AS GradeDesc, 
    (SELECT ModelDesc FROM store_item_models WHERE ID = '$model' LIMIT 1) AS ModelDesc, 
    (SELECT BrimDesc FROM store_item_brims WHERE ID = '$brim' LIMIT 1) AS BrimDesc 
1

Вы могли бы добиться этого с помощью запроса на объединение, как следующее:

(SELECT WeaveDesc FROM store_item_weaves WHERE ID = '$weave' LIMIT 1) 
UNION 
(SELECT GradeDesc FROM store_item_grades WHERE ID = '$grade' LIMIT 1) 
UNION 
(SELECT ModelDesc FROM store_item_models WHERE ID = '$model' LIMIT 1) 
UNION 
(SELECT BrimDesc FROM store_item_brims WHERE ID = '$brim' LIMIT 1) 

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

Также само собой разумеется, что вы должны следовать наилучшей практике вашего языка программирования, чтобы использовать параметризованные запросы для предотвращения внедрения SQL.

0

Если все запросы возвращают одинаковое количество полей и соответствующие поля имеют одинаковые типы и значения, то вы можете объединить четыре запросов в один запрос с использованием UNION:

(SELECT 'weave' AS item, WeaveDesc AS desc FROM store_item_weaves WHERE ID = '$weave' LIMIT 1) 
UNION 
(SELECT 'grade' AS item, GradeDesc FROM store_item_grades WHERE ID = '$grade' LIMIT 1) 
UNION 
(SELECT 'model' AS item, ModelDesc FROM store_item_models WHERE ID = '$model' LIMIT 1) 
UNION 
(SELECT 'brim' AS item, BrimDesc FROM store_item_brims WHERE ID = '$brim' LIMIT 1) 

Запрос получает не более 4 строк, не более 1 из каждой таблицы. Каждая строка имеет столбцы item (используйте ее, чтобы узнать, из какой таблицы были извлечены каждая строка) и desc (фактическое значение, извлеченное из таблицы).

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

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