php - mysql join 右边获取多行

标签 php mysql join

我有两个表:

# 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/

相关文章:

mysql - 左连接和右连接是否足够?

php - 将sql结果集转换为字符串,php

mysql - 从 mysql 返回日期晚于现在的数据

php - 如何使div 100%宽度减去一定量?

mysql - 插入俄语字符变成问号(?????????????)

sql-server - SQL Server 中的条件连接

ruby-on-rails - 两个表之间的连接在 Activerecord 中失败,出现未初始化的常量错误

sql-server - SUM 和 JOIN 显示在一条记录中

php - CSS 如何防止 html 文件的主体和包含的文件合并?

php - 获取 2 个数组之间的差异