你能用一个查询制作多级数组吗?

时间:2012-09-19 15:55:48

标签: mysql performance multi-level

是否可以使用mysql查询创建多级数组?例如。如果我想为每种产品拍4张照片?

[1] => Array( 'name' => 'Product 1', 'picture' => array('picture1','picture2','picture3','picture4') )
[2] => Array( 'name' => 'Product 2', 'picture' => array('picture5','picture6','picture7','picture8') )

或者我是否需要制作一个foreach来循环遍历产品,然后在foreach中创建一个mysql查询来获取每个产品的图片?

编辑:

我的结构是:

P_Attributes
--------
id, int(15)
name, varchar(256)


P_AttributeValues
--------
id, int(15)
value, varchar(256)
attribute_id, int(15) [NOTE: This is connected to P_Attributes.id]

然后我希望将所有P_AttributeValues传递给P_Attribute行 - 并在一个查询中获取它。这可能吗?

编辑2:

通过接受的答案作者的查询,我使用了这个PHP代码:

$attributevalues = $auctionClass->get_rows($id);

$attr_val = array();
foreach($attributevalues as $k => $v){
    $attr_val[$v->AID]['attr_name'] = $v->AName;
    $attr_val[$v->AID]['parameters'][] = array('attr_value_name' => $v->name, 'id' => $v->id);
}

3 个答案:

答案 0 :(得分:1)

这是一篇关于进行此类查询的好文章:

http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

您可以调整他们的示例以满足您的需求。

答案 1 :(得分:0)

根据您的表结构,您可以拉出包含您要查找的所有内容的行,然后从该行编写数组的创建。

答案 2 :(得分:0)

如果您只是使用普通的JOIN查询并对其进行排序,则可以从记录中获取可以形成必要层次结构的行。

SELECT pa.id AS product_id, pa.name , pav.id AS product_attr_id, pav.value
FROM P_Attributes pa JOIN P_AttributeValues pav ON pav.attribute_id = pa.id
ORDER BY pa.id ASC, pav.id ASC

这将生成如下行:

product_id, name, product_attr_id, value
1, "Product 1", 1, "picture1"
1, "Product 1", 2, "picture2"
1, "Product 1", 3, "picture3"
1, "Product 1", 4, "picture4"
2, "Product 2", 5, "picture5"
2, "Product 2", 6, "picture6"
2, "Product 2", 7, "picture7"
2, "Product 2", 8, "picture8"

不知道你正在使用什么MySQL扩展,大概是PHP,因为我提到它并且你没有纠正我。如果您按照以下格式获取每个记录返回的关联数组:

array('product_id' => 1, 'name' => "Product 1",
      'product_attr_id' => 1, 'value' => "picture1");

如果你有一个名为$products的主数据数组,只需将此代码放在循环中就可以生成它,假设记录被调用$productRec并在此之前填入循环。

if (!array_key_exists($productRec['product_id'], $products)) {
    $products[$productRec['product_id']] = array('name' => $productRec['name'],
                                                 'picture' => array());
}

$products[$productRec['product_id']]['picture'][$productRec['product_attr_id']] =
    $productRec['value'];

使用密钥的ID应该没问题,假设它们是没有重复的主键。援助会以这种方式查找,而不是丢失那些数据。