1

ユーザーがクライアント、製品、コンポーネント、プロバイダーなどを管理できる会社向けのカスタム オンライン管理アプリケーションを作成しています。現在、ユーザーがキーワードやさまざまなオプションを使用してクライアントを検索できる検索フォームに取り組んでいます。これで、キーワード検索について、MySQL FullText の使用方法がわかりました。問題は、追加の検索オプションに関連しています。

したがって、基本的に、すべてのクライアントを 1 つまたは複数のカテゴリに割り当てることができます。クライアントがどのカテゴリにも割り当てられていない場合もあります。そのために、次の 3 つのテーブルを使用します。

  • 名前、連絡先情報など、クライアントの基本情報を保持する「clients」テーブル。各クライアントには一意の ID があります。
  • ID、タイトル、説明フィールドのみを含む「カテゴリ」テーブル
  • 「categories_assign」テーブルには、「clientId」と「categoryId」の 2 つのフィールドしかありません。クライアントに複数のカテゴリを割り当てることができます。

現在、検索フォームで、ユーザーは検索するカテゴリを選択できます。一度に複数のカテゴリを選択できます。また、カテゴリなしでクライアントを検索する「なし」の値も選択できます。カテゴリのないクライアントは、基本的に「categories_assign」テーブルにエントリがありません。

それが私の問題です。特定のカテゴリに割り当てられたクライアントを検索するのに問題はありませんが、カテゴリなしでクライアントを検索する方法が見つかりません..

選択したカテゴリに従ってクライアントを選択するクエリの簡易版 (読みやすくするため) を次に示します。

SELECT * FROM clients c, categories_assign a WHERE c.id = a.clientId AND a.categoryId IN(1,7,43,52)

ご想像のとおり、これはカテゴリ ID 1、7、43、または 52 に割り当てられたクライアントを選択します。これは正常に機能します。ただし、前に述べたように、カテゴリなしでクライアントを選択する方法が見つかりません。「categories_assign」テーブルにエントリがないクライアント。同時に特定のカテゴリも選択できるようにしたい。(たとえば、カテゴリ ID 1、7、43、52 AND カテゴリのないクライアントを検索します)。結合を使用してみましたが、うまくいきませんでした。

私が考えることができる唯一の回避策は、「categoryId」を0に設定して「categoryId」テーブルにエントリを作成することです。これは「カテゴリなし」を意味するため、「categoryId」0を検索するだけです。可能であれば、これを行う必要がないようにします。

誰にも手がかりはありますか?

前もって感謝します!

4

2 に答える 2

1
SELECT DISTINCT c.*
FROM clients c
LEFT JOIN categories_assign a ON c.id = a.clientId
WHERE a.id IS NULL
OR a.categoryId IN (1, 7, 43, 52)

a.id IS NULL、カテゴリが割り当てられていないものを取得します。はa.categoryId IN (...)、それらのカテゴリに割り当てられたものを取得します。

DISTINCT未分類のレコードを取得するためだけにクエリを作成している場合は、句は必要ありません。これは、探している複数のカテゴリにクライアントが割り当てられる可能性から生じる重複レコードを排除するためのものです。

于 2012-07-13T17:20:07.750 に答える
0
SELECT * FROM clients c 
WHERE c.id NOT IN (SELECT DISTINCT a.clientID FROM categories_assign a)

これにより、categories_assign テーブルに表示されないすべてのクライアントが返されます。同時にカテゴリを使用してクライアントの検索も行いたい場合は、UNIONこのクエリとあなたのクエリだけです。

于 2012-07-13T17:18:26.280 に答える