实际上这篇文章是为了两个问题,因为第一个问题会引出第二个问题。
我有一个 Mysql 查询,需要在其中选择 2 个表。第一个表有 1 行(主表),第二个表有多行(连接表)。
仅将parent_id和entity_id连接起来即可获得结果,我创建了一个查询,其中它将第二个表的列结果仅连接到一行,然后将其连接到第一个表。
这是查询。
SELECT `main_table`.*,
(SELECT GROUP_CONCAT(comment SEPARATOR '----' )
FROM `mgmx_sales_flat_invoice_comment` a WHERE a.parent_id = main_table.entity_id
group by a.parent_id)
FROM `mgmx_sales_flat_invoice_grid` AS `main_table`
INNER JOIN `mgmx_sales_flat_invoice_comment` AS `a`
ON a.parent_id = main_table.entity_id
第一个问题是: 它显示了我想要的结果,但它返回了 2 行,其中包含类似的数据,如下面的示例。如何消除第二条记录。
第二个问题: 如何将其转换为 Zend_Framework/Magento $collection 查询。
到目前为止,我有这个查询,但我需要应用上面的查询。
protected function _prepareCollection()
{
$collection = Mage::getResourceModel($this->_getCollectionClass());
$collection->getSelect()->join( array('a'=> mgmx_sales_flat_invoice_comment), 'a.parent_id = main_table.entity_id', array('a.comment'));
$this->setCollection($collection);
return parent::_prepareCollection();
}
最佳答案
我对 Magneto 并不熟悉,而且它看起来并不简单,所以我不会尝试这样做。
但是,如果您将“相关子查询”从 select 子句中移出并作为子查询移入 from 子句中,则转换可能会更简单。老实说,这种方式可能也更有效。
SELECT `main_table`.* , c.comments
FROM `mgmx_sales_flat_invoice_grid` AS `main_table`
INNER JOIN `mgmx_sales_flat_invoice_comment` AS `a` ON a.parent_id = main_table.entity_id
LEFT JOIN (
SELECT a.parent_id, Group_concat(comment SEPARATOR '----') as comments
FROM `mgmx_sales_flat_invoice_comment` a
GROUP BY a.parent_id
) c ON a.parent_id = main_table.entity_id
----
前一个问题展示了如何在 Magneto Using an expression as a join 中左连接子查询.
将这个逻辑应用到我的建议中,它看起来像这样(看起来)
$query = 'SELECT parent_id, Group_concat(comment SEPARATOR ', ') as comments FROM `mgmx_sales_flat_invoice_comment` GROUP BY parent_id';
$collection->getSelect()->joinLeft(
new Zend_Db_Expr('('.$query.')'),
'main_table.entity_id = t.parent_id',
array('author_debit_amount')
);
但我不明白别名 t 来自哪里(它在前面引用的问题中使用)
关于php - 将 Mysql 查询转换为 Magento 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47110398/