4

作为具有动态生成元素的更大查询的一部分,我需要进行左连接和计数。这是我需要的查询。

SELECT slug, name, count(client_tests.id) AS test_count
  FROM clients
  LEFT JOIN client_tests ON clients.id = client_tests.client_id
  GROUP BY clients.id;

我尝试构建一个连接查询,但 Lithium 似乎期望连接成为关系的一部分(未定义任何关系),如下所示(暂时忽略计数)。

$join = new Query(array(
  'source' => 'client_tests',
  'model' => '\app\models\ClientTest',
  'type' => 'LEFT',
  'constraint' => array('Client.id' => 'ClientTest.client_id'),
));
$clients = Client::all(array(
  'conditions' => $conditions,
  'group' => 'Client.id',
  'joins' => array($join)
));

这导致Notice: Undefined index: ClientTest in /usr/local/www/oars/libraries/lithium/data/collection/RecordSet.php on line 340,这似乎是与关系相关的代码。

如果我确实定义了hasManyClient 和 ClientTest 之间的关系,它将为我处理构建左连接,有没有办法获取 Client 字段和计数?

$clients = Client::all(array(
  'fields' => array('slug', 'name', 'count(ClientTest.test_id) as test_count'),
  'conditions' => $conditions,
  'group' => 'Client.id',
  'with' => 'ClientTest'
));

这导致( ! ) Notice: Undefined index: count(ClientTest in /usr/local/www/oars/libraries/lithium/data/source/Database.php on line 650,所以要么不可能,要么我使用了错误的语法。

我可以直接使用 直接发出查询Client::connection()->read($sql),但是由于查询中有动态元素,所以无论如何我都必须构建 SQL。

有没有办法让上述方法起作用,还是我应该手动构建 SQL?

4

4 回答 4

1

如果我对您的理解正确,那么您已经拥有返回您正在寻找的结果集的 SQL 查询,但在使用锂时遇到了问题。我建议试试这个。如果您在 SQL 中创建所需的查询视图,则可以让锂向视图发送一个简单的请求。我完全没有锂的经验,但我希望这会有所帮助。祝你好运。

于 2012-07-26T14:15:17.760 回答
0

好像你只是错过了输入你的表名,

'constraint' => array('Client.id' => 'ClientTest.client_id')

但是你有 :

LEFT JOIN client_tests ON clients.id = client_tests.client_id

您刚刚在 client_tests 和 ClientTest 之间犯了错误吗?

于 2012-08-08T13:56:14.123 回答
0

我必须首先承认我不熟悉锂。但是,在 SQL 中有两种方法可以解决此问题,您不妨尝试一下。

我假设您正在尝试获取作为每行附加列返回的总行数。

第一个需要称为窗口函数(Oracle 中的分析函数)的东西。查询如下所示:

SELECT *, count(*) over (partition by clients.id) AS test_count
FROM clients LEFT JOIN client_tests
     ON clients.id = client_tests.client_id

第二种方法用于不支持此功能的数据库中。要使用一个查询来处理它,可以使用以下方法:

with q as (SELECT c.*, <whatever columns you want from client_tests
           FROM clients LEFT JOIN
                client_tests
                ON clients.id = client_tests.client_id
          )
select q.*, qsum.test_count
from q join
     (select id, count(*) as test_count
      from q
      group by id
     ) qsum
     on q.id = qsum.id

也许其中之一将适用于您的情况。

于 2012-05-05T18:42:33.987 回答
0

您的查询似乎很奇怪。尝试这个:

SELECT slug, name, count(client_tests.id) AS test_count
FROM clients
LEFT JOIN client_tests ON clients.id = client_tests.client_id
GROUP BY clients.id;
于 2012-05-05T18:53:53.197 回答