0

これが私が必要なものを説明するための例です:

私は3つのテーブルを持っています:

 contact: { id, invoices, name } // a contact can have several invoices
 invoice: { id, contact, lines, comment } // an invoice can have several lines but only one contact
 line: { id, invoice, designation } // a line can have only one invoice

ユーザーが請求書を検索する場合、コメント、指定、名前の各フィールドにクエリを実行し、一致する請求書のみを取得します。

だから私はこれをしました:

SELECT 
  invoice.id AS id, 
  invoice.contact AS contact, 
  invoice.comment AS comment, 
FROM invoice 
  LEFT JOIN contact ON invoice.contact = contact.id 
  LEFT JOIN line ON line.invoice = invoice.id
WHERE (
  contact.name LIKE '%SEARCH_TERM%' OR 
  invoice.comment LIKE '%SEARCH_TERM%' OR 
  line.designation LIKE '%SEARCH_TERM%'
)

これは、請求書に検索語と一致する行が複数ある場合、同じ請求書を数回取得することを除いて機能します。

だから私の質問は:検索語がいくつかの関連するレコードで見つかったとしても、請求書を一度だけ取得する方法はありますか?

また、ALIASを使用せずに請求書のフィールドのみを取得する方法はありますか(検索以外のテーブルの連絡先と行は気にしません)?

あなたがそれをするより良い方法を知っているなら、私はそれを聞いてみたいです。

4

3 に答える 3

1
SELECT 
  DISTINCT invoice.*
FROM invoice 
  LEFT JOIN contact ON invoice.contact = contact.id 
  LEFT JOIN line ON line.invoice = invoice.id
WHERE (
  contact.name LIKE '%SEARCH_TERM%' OR 
  invoice.comment LIKE '%SEARCH_TERM%' OR 
  line.designation LIKE '%SEARCH_TERM%'
)
于 2012-06-03T16:08:25.217 に答える
1

はい。これを行うには、WHERE句にサブクエリを追加します。

SELECT invoice.id AS id, invoice.contact AS contact, invoice.comment AS comment, 
FROM invoice LEFT JOIN
     contact
     ON invoice.contact = contact.id 
WHERE contact.name LIKE '%SEARCH_TERM%' OR 
      invoice.comment LIKE '%SEARCH_TERM%' OR
      invoice.id in (select line.invoice
                     from line
                     where line.designation LIKE '%SEARCH_TERM%')

サブクエリを使用して、FROM句でこれを構造化することもできます。

SELECT invoice.id AS id, invoice.contact AS contact, invoice.comment AS comment, 
FROM invoice LEFT JOIN
     contact
     ON invoice.contact = contact.id left join
     (select distinct line.invoice
      from line
      where line.designation LIKE '%SEARCH_TERM%'
     ) line
     on line.invoice = invoice.id
WHERE contact.name LIKE '%SEARCH_TERM%' OR 
      invoice.comment LIKE '%SEARCH_TERM%' OR
      line.invoice is not null

この構成では、複数の行に検索語がある場合、重複する行を防ぐために個別のキーワードが必要です。

于 2012-06-03T16:11:21.677 に答える
0

DISTINCTは機能しますか?

SELECT DISTINCT
  i.id, 
  i.contact, 
  i.comment, 
FROM invoice AS i
  LEFT JOIN contact ON i.contact = contact.id 
  LEFT JOIN line ON line.invoice = i.id
WHERE (
  contact.name LIKE '%SEARCH_TERM%' OR 
  i.comment LIKE '%SEARCH_TERM%' OR 
  line.designation LIKE '%SEARCH_TERM%'
)
于 2012-06-03T16:10:26.300 に答える