【问题标题】:mysql FROM clause with subquery in Cakephp 3Cakephp 3中带有子查询的mysql FROM子句
【发布时间】:2016-01-28 07:39:28
【问题描述】:

我想在 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

【问题讨论】:

  • 我建议阅读 API 文档,如果您想将子查询传递给 FROM 部分而不是链接问题中的 SELECT 部分,那么您应该看看Query::from().
  • 按id排序是什么意思?由于您正在分组,因此您无法确定 mysql 将返回什么 id。您可以只使用像 MIN(id) 这样的聚合函数。我什至不确定您是否需要子查询。看看here
  • @ndm。你是对的,因为我需要这样的东西。但我不明白如何传递我的子查询($sublastitem),因为它看起来像一个对象。
  • @arilia,这样做完全有道理,因为我想先执行 order by,然后再执行 group by。换句话说,我可以说我想要最后一行数据而不使用连接。
  • mysql 手册说 选择的值是不确定的 您在不使用聚合函数的情况下进行分组。所以 mysq 会随机选择要显示的值。也许你很幸运并得到了想要的结果,但你不能确定

标签: php mysql cakephp subquery cakephp-3.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)

请参阅食谱中的 SubQueries

【讨论】:

  • 当我更新我的问题时。请检查一下。因为这个解决方案是不可接受的,因为我在执行查询时遇到问题,而不是逻辑。所以我无法按照您的建议更改此查询。
  • 是否可以输入您想要的查询?因为坦率地说,我真的不明白你在问什么:/
  • 我编辑了查询。你是对的,因为我忘了在子查询中添加订单。
猜你喜欢
  • 2016-07-31
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
  • 2021-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多