查询优化/数据检索

时间:2011-11-12 00:24:31

标签: 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;
}

修改:删除了与我的问题无关的部分查询

2 个答案:

答案 0 :(得分:1)

使用mySQL的

EXPLAIN SELECT ...

要学习的陈述,how mySQL executes your statement。从那里开始修改它。

答案 1 :(得分:1)

可以使用进一步的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声明对我来说没问题!