Flakelf
@Flakelf

Как соединить четыре SQL-запроса в один?

Добрейшего вечерочка.

Как соединить четыре SQL-запроса воедино?

// $type = '1';
// $model = 'ABARTH';
// $model = '500';
// $capacity = '1400';

    function getECUTypes($type, $brand, $model, $capacity) {

      $dbc = self::getConnection();

      $query = "SELECT `auto_sel_brand_id` FROM `auto_sel_brand` WHERE `auto_sel_brand_name` = '$brand' AND `auto_sel_brand_type` = '$type'";

      $result = $dbc->query($query) or DIE($dbc->error);

      $rows = $result->fetch_assoc();

      $brand_id = $rows['auto_sel_brand_id'];

      $query = "SELECT `auto_sel_model_id` FROM `auto_sel_model` WHERE `auto_sel_model_name` = '$model' AND `auto_sel_model_brand` = '$brand_id'";

      $result = $dbc->query($query) or DIE($dbc->error);

      $rows = $result->fetch_assoc();

      $model_id = $rows['auto_sel_model_id'];

      $query = "SELECT `auto_sel_ecu_id` FROM `auto_sel_motor` WHERE `auto_sel_ecu_motor` = '$model_id' AND `auto_sel_ecu_name` = '$capacity'";

      $result = $dbc->query($query) or DIE($dbc->error);

      $rows = $result->fetch_assoc();

      $ecu_id = $rows['auto_sel_ecu_id'];

      $query = "SELECT `auto_sel_motor_name` FROM `auto_sel_ecu` WHERE `auto_sel_motor_model` = '$ecu_id'";

      $result = $dbc->query($query) or DIE($dbc->error);

      $result_array = [];
      while ($rows = $result->fetch_assoc()) {
          array_push($result_array, $rows);
      }

      return $result_array;

    }


Каждый SQL-запрос возвращает какое-то значение, нужное для следующего запроса, конкретно уникальный ключ в виде ID. Как оптимизировать ? Этот код ужасен и работает медленно.
  • Вопрос задан
  • 695 просмотров
Пригласить эксперта
Ответы на вопрос 3
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
1) читать про join
2) читать про индексы тут, тут и тут.
3) составить запрос и прогнать его через explain.
4) Настроить индексы...
5) Profit
Ответ написан
Комментировать
@nozzy
Symfony, Laravel, SQL
Не проверял, как то так
$sub_query = "SELECT t3.`auto_sel_ecu_id` FROM `auto_sel_brand` t1
JOIN `auto_sel_model` t2 ON t2.`auto_sel_model_brand` = t1.auto_sel_brand_id AND t2.`auto_sel_model_name` = '$model'
JOIN `auto_sel_motor` t3 t3.`auto_sel_model_brand` = t2.'auto_sel_brand_id' AND AND `auto_sel_ecu_name` = '$capacity'
WHERE t1.`auto_sel_brand_name` = '$brand' AND t1.`auto_sel_brand_type` = '$type'";

$query = "SELECT `auto_sel_motor_name` FROM `auto_sel_ecu` WHERE `auto_sel_motor_model` IN ('$sub_query')";

$result = $dbc->query($query) or DIE($dbc->error);

....
Ответ написан
Комментировать
alex-1917
@alex-1917
Если ответ помог, отметь решением
Склеивание через джойны не поможет, у вас плоские запросы и должны работать мгновенно, профилируйте запросы по отдельности и смотрите, чо и как.
Как тут выше-ниже советуют - то на то и выходит, никакой оптимизации не будет! так как у вас результат в виде ID получается сугубо по результатам очередного запроса, то вся байда будет стоять и ждать - лучше, если эта байда будет ждать в приложении (PHP), нежели вся байда будет висеть в памяти MySQL в ожидании...
Задайте на SC, там уровень спецов ощутимо выше, в идеале если Mike ответит...

UPD. Кстати, почему для получения одного ID вы юзаете fetch_assoc?????))))
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы