2012-04-29 10 views
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; 

私が参加し、クエリを構築しようとしましたが、リチウムは(今のカウントを無視して)以下に示すように、(何の関係が定義されていない)関係の一部であることを参加を期待しているようです。

$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もたらします。

クライアントとClientTestの間にhasManyの関係を定義すると、私のために左結合を作成することができますが、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を構築して行くべきですか?

答えて

0

私が最初に私がリチウムに慣れていないだということを認めなければなりません。しかし、SQLでこれにアプローチするには2通りの方法があります。

私はあなたがそれぞれの行の追加列として返される行の合計数を取得しようとしていると仮定しています。

最初に、ウィンドウ関数(Oracleでは分析関数とも呼ばれる)が必要です。クエリは次のようになります。

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

2番目の方法は、これをサポートしていないデータベースで使用されます。 1つのクエリ、次のような作品でそれを処理するために:おそらく

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 

これらの一つは、あなたのケースで動作します。

+0

質問を書くことは問題ではないが、それをLithiumで動作させる最も良い方法は、特に質問した質問である。 – michaeltwofish

+0

元のクエリはSQLとして意味がありません。グループには "select *"があります。正しいSQLクエリーで始めると、おそらく残りの部分が失われます。 –

+0

私はあなたの助けに感謝し、私はSQLにうんざりでしたが、クエリは問題ではありません。私が最終的に何をしたいのかを説明するのは問題ですが、どこでも入力として使用されることはありません。 – michaeltwofish

0

あなたのクエリは奇妙なようです。私はあなたが正しくあなたはすでにあなたが探しているが、リチウムとのトラブルを抱えている結果セットを返すSQLクエリを持って理解していた場合

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; 
+0

クエリは問題ではありません。 – michaeltwofish

1

:これを試してみてください。私はこれを試すことを提案します。 SQLで必要なクエリのビューを作成すると、代わりにリチウムが単純な要求をビューに送信するように設定できます。私はリチウムに関する経験は全く持っていませんが、それが助けてくれることを願っています。がんばろう。

LEFT JOIN client_tests ON clients.id = client_tests.client_id 

あなただけclient_testsとClientTest間のミスを犯しました:

0

は、あなたは、単に、

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

を自分のテーブル名をmissTypedしかし、あなたが持っているように思えますか?

+0

いいえ、リチウムはテーブルを自動的にエイリアスします。 – michaeltwofish

関連する問題