我有两个表:
# products (id,name,value,time)
# product_data (id,product_id,field_name,field_value)
(1,1,color,red)
(2,1,size,big)
(3,1,whatever,value)
我想进行一个查询,从产品表中获取字段值,并添加具有相同产品 ID 的所有 product_data 行,如下所示:
$row = array(
id => 1,
name => Gloves,
value => 15,
color => red,
size => big,
...
)
也许这不是存储所有数据的好方法,我应该将所有字段存储在一个表中,但由于会有很多不同的产品类型,因此总会有很多空字段。查询会像那样简单得多,因为我必须能够按颜色对产品进行排序(例如,按 products_data
中的值)。
例如,我试过这个,但这只列出字段名称,而不是值:
SELECT *,
group_concat(product_data.fname) AS afield
FROM product_data
LEFT JOIN products ON products.id = product_data.pid
最佳答案
看看这个solution和问题,因为它们有些相似。它涉及触发两个查询并使用 PDO::FETCH_GROUP。您将得到一个类似于此行的 $product
行:
$product = [
'id' => 1,
'name' => 'somename',
...
'product_data' => [
['field_name'=> 'color', 'value'=> 'red'],
['field_name'=> 'size', 'value'=> 'XXL'],
.
.
.
['field_name' => 'fabric', 'value' => 'cotton']
]
];
这是我根据上述提示得出的版本:
$db = getConnection();
$sql_products = "SELECT * FROM products";
$stmt = $db->prepare($sql_products);
$stmt->execute();
$products = $stmt->fetchAll(PDO::FETCH_OBJ);
$productIds;
foreach ($products as $product) {
$productIds[]=$product->id;
}
$productIds = implode(',',$productIds);
$sql_data = "SELECT product_id, field_name, field_value FROM product_data WHERE product_id IN ($productIds)";
$stmt = $db->prepare($sql_data);
$stmt->execute();
$products_data = $stmt->fetchAll(\PDO::FETCH_GROUP|\PDO::FETCH_OBJ);
foreach ($products as &$product) {
if(isset($products_data[$product->id])){
$product->data = $products_data[$product->id];
} else {
// no data found, empty array
$product->data = [];
}
}
echo json_encode($products);
关于php - mysql join 右边获取多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32200444/