Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 简单地将MySql查询转换为单连接_Php_Mysql_Arrays - Fatal编程技术网

Php 简单地将MySql查询转换为单连接

Php 简单地将MySql查询转换为单连接,php,mysql,arrays,Php,Mysql,Arrays,我需要将两个查询合并到一个联接中,但我的SQL技能不是最好的 我的问题是: $query = $this->db->query(" SELECT p2c.product_id, p.model FROM {$this->prefix}product_to_category p2c LEFT JOIN {$this->prefix}product p ON (p2c.product_id = p.product_id)

我需要将两个查询合并到一个联接中,但我的SQL技能不是最好的

我的问题是:

$query = $this->db->query("
    SELECT p2c.product_id, p.model 
    FROM {$this->prefix}product_to_category p2c 
    LEFT JOIN {$this->prefix}product p 
        ON (p2c.product_id = p.product_id) 
    WHERE p.status < '3' 
    ORDER BY p2c.product_id ASC
");

$products = array();

foreach($query->rows as $product):
    $cats = $this->db->query("
        SELECT category_id 
        FROM {$this->prefix}product_to_category 
        WHERE product_id = '" . (int)$product['product_id'] . "'
    ");

    $categories = array();

    foreach($cats->rows as $category):
        $categories[] = $category['category_id'];
    endforeach;

    $products[$product['model']] = array(
        'product_id' => $product['product_id'],
        'categories' => $categories
    );
endforeach;

return $products;
显然,对于较大的单个数组中的每个产品,都会返回此数组


我确信这可以合并到一个查询中,因为第二个查询来自第一个查询表中的一个,但我不知道如何在不执行第二个查询的情况下将所有类别捕获到它们自己的单独数组中。

这可能是一个解决方案:

$query = $this->db->query("

    SELECT p.product_id, p.model, GROUP_CONCAT(p2c.category_id SEPARATOR ',') as categories
    FROM {$this->prefix}product p
    LEFT JOIN {$this->prefix}product_to_category p2c      
        ON (p.product_id = p2c.product_id ) 
    WHERE p.status < 3
    ORDER BY p2c.product_id ASC GROUP BY p.product_id

");

$products = array();

foreach($query->rows as $product):

    if ( ! array_key_exists($product['model'],$products) ){
      $products[$product['model']] = array()
    }

    array_push( $products[$product['model']],  array(
          'product_id' => $product['product_id'],
          'categories' => explode(',', $product['categories'])
      )
    )

endforeach;

return $products;
$query=$this->db->query(“
选择p.product_id、p.model、GROUP_CONCAT(p2c.category_id分隔符',')作为类别
从{$this->prefix}产品p
左连接{$this->prefix}产品到类别p2c
ON(p.product\U id=p2c.product\U id)
其中p.status<3
按p2c.product\U id订购ASC组按p.product\U id订购
");
$products=array();
foreach($query->行作为$product):
如果(!array_key_存在($product['model',$products)){
$products[$product['model']]=array()
}
阵列推送($products[$product['model']],阵列(
'product_id'=>$product['product_id'],
“类别”=>分解(“,”,$product[“类别”])
)
)
endforeach;
退回$products;

虽然不是直接的答案,但通常非常有用。感谢您的链接,但这并不能真正帮助我。您的左连接实际上是一个内部连接,我想我根本不理解第二个查询的必要性。也许一个sqlfiddle(和期望的结果集)会有所帮助。好主意,谢谢。对此只做了几处更改,GROUPBY子句需要p.product_id和p.model,并且需要位于ORDERBY子句之前。谢谢你的帮助。
$query = $this->db->query("

    SELECT p.product_id, p.model, GROUP_CONCAT(p2c.category_id SEPARATOR ',') as categories
    FROM {$this->prefix}product p
    LEFT JOIN {$this->prefix}product_to_category p2c      
        ON (p.product_id = p2c.product_id ) 
    WHERE p.status < 3
    ORDER BY p2c.product_id ASC GROUP BY p.product_id

");

$products = array();

foreach($query->rows as $product):

    if ( ! array_key_exists($product['model'],$products) ){
      $products[$product['model']] = array()
    }

    array_push( $products[$product['model']],  array(
          'product_id' => $product['product_id'],
          'categories' => explode(',', $product['categories'])
      )
    )

endforeach;

return $products;