在Cakephp 3中带有子查询的mysql FROM子句

时间:2016-01-28 07:39:29

标签: php mysql cakephp subquery cakephp-3.0

我想在cakephp 3中使用带有主查询的子查询。正如我所见this link,这很好理解。但我想在mysql FROM子句中使用子查询。即,“SELECT * FROM(SELECT * FROM table_name)”。但我对它的语法无法理解。如果有人曾经在cakephp 3中尝试过这个,那么答案将不胜感激。这里有一些代码,我尝试过,但对我没用。

$purchases = TableRegistry::get('Purchases');
                $sublastitem = $purchases->find()
                    ->select([
                        'id',
                        'customer_id',
                        'item'
                    ])
                    ->where(function ($exp, $q) use($custids)
                    {
                        return $exp->in('customer_id', ['1','2']);
                    })
                    ->order(['id' => 'DESC']);

上面是我想在FROM子句中使用的子查询。

我尝试过这些代码(已经尝试了注释行。其他的就像所有尝试一样)。

// $lastitem = $sublastitem->find();
// $lastitem = $purchases->find($sublastitem);
// $lastitem = $purchases->all($sublastitem);
            $lastitem->select([
                'id',
            ]);
            $lastitem->group('customer_id');

我找到了一个更清楚地描述我的问题的链接。但是这个链接中的答案对我来说是不可接受的,因为我想在GROUP BY之前执行ORDER BY。这是link

这是我在Cakephp 3中想要的查询。

SELECT * FROM (SELECT 'id', 'customer_id', 'item' FROM purchases WHERE customer_id IN (1, 2) ORDER BY id) t GROUP BY customer_id

1 个答案:

答案 0 :(得分:1)

您必须创建两个单独的查询对象。 这意味着您必须使用与此类似的语法:

$matchingUsers = $users->find('all')->select('id');

$matchingPaurchases = $purchases->find('all')->where(['user_id' => $matchingUsers]);

这将创建如下内容: SELECT purchase_id, purchase_price, purchase_item_id FROM purchases WHERE user_id IN(1,2,3,4,5)

请参阅CookBook中的SubQueries