特定のパラメータを持つ別のテーブルに請求書IDが表示されない請求書の一覧を検索しようとしています。この問題は一日中私を悩ませています。私は存在していないではないのバリエーションを試してみた。ここ Sql to Dqlどこに存在しないか存在しません
は私が最終的に達成しようとしているSQLです:私はこれを理解しようとして学んだことから、SELECT * FROM invoices
JOIN invoiceitem
WHERE invoiceitem.class = 'ITEM'
AND invoices.rmlist >= $date1
AND invoices.rmlist <= $date2
AND NOT EXISTS (
SELECT * FROM invoice_history
WHERE invoices.id = invoice_history.invid
AND invoice_history.ttype = 'PR'
AND invoice_history.note = 'Vouchers Printed')
AND invoiceitem.voucherrequired = 1
GROUP BY invoices.id
ORDER BY invoices.depdate ASC
、「何もありません存在しない "とdqlに書かれているので、私は代わりに" Not In "メソッドを使用しようとしています。基本的に、これは私の努力が私をもたらしたところです:
$q2 = $em->createQueryBuilder()
->from('ClicctTravelBundle:InvoiceHistory', 'ih')
->Where("ih.ttype = 'PR'")
->andWhere("ih.note = 'Vouchers Printed'")
->groupBy('ih.invid');
$qb->leftJoin('i.history', 'h')
->where($qb->expr()->notExist('i.id', $q2->select('ih.invid')->getDQL()));
私は間違っていますか?ご協力いただきありがとうございます!
[編集]
私は私の問題を解決したと信じています。このコードは私のために働いているようです:
$qb = $em->createQueryBuilder()
->from('ClicctTravelBundle:Invoices', 'i')
->join('i.invoiceitems', 'b')
->select('i')
->Where("b.class = 'ITEM'")
->andWhere("i.rmlist >=:fdate")
->setParameter("fdate",$fromdate)
->andWhere("i.rmlist <=:tdate")
->setParameter("tdate",$todate)
->orderBy('i.depdate')
->groupBy('b.invoiceno');
$qb2 = $em->createQueryBuilder()
->select("h")
->from("ClicctTravelBundle:InvoiceHistory","h")
->andWhere("h.invid = i.id")
->andWhere("h.note = 'Vouchers Printed'");
$qb->andWhere($qb->expr()->not($qb->expr()->exists($qb2->getDQL())));
ありがとうございました!
私はDQLを知らないので、どうやってやるのかは分かりませんが、私はいつも 'NOT IN'sが_very_inefficientであることを発見しました。あなたがあなたのクエリを再加工することができるならば、はるかに実行可能な方法は、 'a.id = b.id WHERE b.id IS NULL'の上でLEFT OUTER JOINからSELECT a.idを実行することです。これは機能的には「NOT IN」と同じですが、オプティマイザがより良いクエリプランを作成できるようにします。 – Shawn
フィードバックありがとうございます。動作しているようですが、他のパラメータを追加するのに問題があります。私は何を試しても構文エラーが出てくる。 invoiceitem.class = 'ITEM' LEFT OUTER JOINをinvoiceitemを登録しよう 請求書FROM SELECT * invoice_history ON invoices.id = invoice_history.invidをinvoice_history.invidが は私に構文エラーを与えNULLです。 – user2725545
@Shawnあなたにタグをつけるのを忘れてしまった – user2725545