оптимизация запросов / извлечение данных

#php #mysql

#php #mysql

Вопрос:

у меня есть запрос, который извлекает некоторые данные из таблиц A и B. между ними существует отношение «один ко многим», где таблица A является единой. я не очень хорошо разбираюсь в mysql, и мне было интересно, могу ли я выполнить этот запрос лучше? цикл для извлечения данных был единственным способом, которым я мог понять, как упорядочить все это для целей отображения, поскольку запрос дублирует информацию в таблице A для каждой уникальной строки в таблице B. было интересно, может ли кто-нибудь показать мне лучший способ?

 $sql = "
  SELECT core.`id` AS attribute_id, core.`gender` as attribute_gender , core.`order` as attribute_order, core.`name` as attribute_name, coreval.`id` AS value_id, coreval.`value` as value_name
  FROM  `core_attributes` core
  LEFT OUTER JOIN  `core_attribute_values` coreval 
  ON core.id = coreval.attribute_id
  WHERE core.active = 1 
  ORDER BY attribute_order
";

try {
  $stmt = $dbh->prepare($sql);
  $stmt->execute(array(':agency_id' => $agency_id));

  $result = array();

  while($row = $stmt->fetch()) {
    $result[$row['attribute_id']]['attribute_id'] = $row['attribute_id'];
    $result[$row['attribute_id']]['attribute_gender'] = $row['attribute_gender'];
    $result[$row['attribute_id']]['attribute_order'] = $row['attribute_order'];
    $result[$row['attribute_id']]['attribute_name'] = $row['attribute_name'];
    $result[$row['attribute_id']]['values'][$row['value_id']] = $row['value_name'];
  }
  return $result;
}
  

редактировать: удалена часть запроса, не связанная с моим вопросом

Ответ №1:

Используйте MySQL

 EXPLAIN SELECT ...
  

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

Ответ №2:

while циклом можно управлять с помощью дополнительного foreach цикла, что немного упрощает его.

 while($row = $stmt->fetch()) {

    // Set $id for each iteration of the while loop
    $id = $row['attribute_id'];

    foreach ($row as $key => $value) {

        // Set $result to the corresponding key => value pairs
        $result[$id][$key] = $value;

    }
}
  

Ваше заявление MySQL выглядит нормально для меня!