#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 выглядит нормально для меня!